Відкрийте м'яку клавіатуру програмно


116

У мене є діяльність, яка не має дочірніх віджетів, і відповідний файл XML є,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

і я хочу відкрити м'яку клавіатуру, коли діяльність починається. І те, що я зараз намагався,

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

Дайте мені кілька порад.


привіт vignesh, але яка потреба відкрити м'яку клавіатуру без будь-якого textView?
ранок

Насправді я намагаюся використовувати ключового слухача в цій діяльності, для цього мені потрібно це зробити.
Виньєш

Те, що ви зробили, правильно. Я не впевнений, чому ти не бачиш клавіатури. Я використовував цей код один раз, щоб запустити клавіатуру без будь-яких дій користувача на editText, і це було успішно.
Вінот

Привіт Vinoth, я змінив свій код так само, як і повідомлення DSouza, і я також оновив своє запитання, тож перевірте, що я можу змінити.
Виньєш

Відповіді:


145

У наступних рядках я використовував м'яку клавіатуру вручну для відображення події onclick, і клавіатура видна.

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

Але я все ще не в змозі відкрити це, поки діяльність відкриється, тож чи є рішення для цього?


@YosiTaguri, набагато елегантніше, якщо ти займаєшся діяльністю. А як щодо фрагментів ?! +1 для обох відповідей
S.Thiongane

а що, якщо вам доведеться відкрити клавіатуру в діалоговому вікні, що має редагувати текст? Як це зробити?
seema

5
@Vignesh: вам потрібно дати деяку затримку, як-то 500 мілісекунд, відкриваючи клавіатуру, якщо ви хочете реалізувати цей код під час запуску діяльності.
Вініт Саксеня

@vinitsaxena Дякую за ваш цінний коментар
Vignesh

я не впевнений, але я намагався отримати будь-який вид, наприклад TextView і додавання слухача, як цей myTextView.post (новий Runnable () {public void run () {// тут ваш метод}}); і коли цей погляд створить, це означає, що весь екран, який видно зараз, ви можете телефонувати, як вам завгодно
Олексій Тимощенко

121

У файлі маніфесту спробуйте додати наступне до того, <activity>що ви хочете показати клавіатурі, коли починається діяльність:

android:windowSoftInputMode="stateVisible"

Це повинно призвести до того, що клавіатура стане видимою при запуску діяльності.

Щоб отримати додаткові варіанти, перегляньте документацію .


3
Бажаю, я міг би частіше звертатись за цю відповідь, просто щоб отримати всі ці брудні хаки внизу сторінки;)
fjdumont

Як ти це робиш програмно? Я хочу лише, щоб клавіатура автоматично відображалася в певних ситуаціях.
freakhead

1
У мене є вхідний діалог , як ця посилання посилання , як показати клавіатура залишиться на активність , а на запрошення? це зробило подяку <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef

7
Він каже "програмно".
Мерт Аккакая

2
Це не працює для мене. Натомість це робить: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya

34

Дотримуйтесь наведеного нижче коду. Я впевнений, що ваша проблема буде вирішена.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

Привіт, я щойно вставив ваш код у функцію onCreate, але все-таки в моїй діяльності нічого не змінилося, якщо ви хочете, щоб я вставив код, я вставлю в коментар.
Виньєш

Коли ви хочете отримати доступ до програмної клавіатури, будь ласка, скажіть мені, щоб я вирішив вашу проблему. Будь ласка, надішліть мені код .... якщо можливо
AndroidDanger

Я хочу встановити onKeyboardActionListener для своєї діяльності, яка не має нічого, крім лінійного макета.
Виньєш

Просто дивіться моє запитання вище, в якому я відредагував код із тим, що ви мені надали.
Виньєш

Ця діяльність призначена лише для клавіатурних дій, я хочу прослухати кожну натиснуту клавішу (використовуючи onKeyboardActionListener), і я передаю її одночасно на локальний сервер
Vignesh

25

Це твори

<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

або

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

2
Дякуємо за програмний спосіб налаштування цього - це працює, тоді як хакі InputMethodManager цього не роблять.
Мартін Висний

17

Все, що мені було потрібно, було розкрити клавіатуру, в дуже точний момент. Це працювало для мене! Спасибі Бенітесу.

    private Handler mHandler= new Handler();

І в дуже точний момент:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 

Це рішення працювало для мене всередині onResume () з невеликою модифікацією щодо затримки дії після публікації: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
Я рекомендую помістити його у зворотний виклик ViewTreeObserver, щоб його викликали на першому макеті, щоб уникнути необхідності чекати довільну кількість часу. Це повинно бути безпечнішим / чуйнішим.
Габріель

Тільки це рішення працювало на мене. У мене були попередні методи, до яких працювали, але, на жаль, для останньої ОС, обробник є працездатним рішенням.
д.м.н. Шафіул Алам Біплоб

12

У наступних рядках я використовував м'яку клавіатуру вручну для відображення події onclick.

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }

9

Помістіть це у метод onResume:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

функція запуску потрібна, тому що, коли ОС запускає метод onResume, ви не можете бути впевнені, що всі перегляди, де малюються, тому метод публікації, названий у вашому кореневому макеті, змушує зачекати, поки кожен вид буде готовий.


1
У мене був SearchView в DialogFragment, і вперше діалог з'явився, фокус фокусувався на SearchView ... але клавіатура НЕ була налаштована, якщо користувач не торкнувся її. Ми намагалися просто використовувати showSoftInput, а також toggleSoftInputFromWindow з OnResume ALONE ... або навіть у OnFocusChangeListener для SearchView ... але жоден із них не працював, тому що, здавалося, стріляв перед тим, як вікно було вичерпане та намальовано ..... .використання цієї події в OnResume остаточно вирішило її.
lepert

8

здається, що це працює

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

здається, це працює краще: in manifest:

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

Здається, маніфест працює в android 4.2.2, але не працює в android 4.0.3


8

в OnCreate метод активності або onActivityCreated фрагмента

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });

6

Я використовував подібне, щоб програмно показувати м'яку клавіатуру, і це працює для мене, щоб запобігти автоматичному зміні екрана під час запуску клавіатури.

У маніфесті:

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

У XXXAktvity:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

Я припускаю, що це заощадить інший час на пошук цієї проблеми.


Працює, але клавіатура залишається видимою, навіть якщо ви закриєте додаток, і як тільки ви закриєте клавіатуру, якщо знову відкриєте додаток, клавіатура не з’явиться
nulll

Я до цього часу не стикався з цією проблемою. Я припускаю, що це проблема пристрою.
Noundla Sandeep

Для чого потрібен таймер? Чи можете ви додати посилання, щоб заглибитись?
nulll

6

Котлін

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Java

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

3

Я використовував це як одиночний, як:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Використовуйте його у своїй діяльності, наприклад:

showSoftKeyboard(this, yourEditTextToFocus);

Дякую вам за включення короткого фрагмента щодо використання функції, а також самої функції. Це працює саме так, як мені було потрібно!
Чад Вілсон

3

Це працює:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

І ви називаєте цей метод так:

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED - не гарний вибір. Якщо ви використовуєте цей параметр, вам слід керувати прихованим станом клавіатури. Моя пропозиція така;

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

Крім того, ви можете зосередитись на перегляді (зазвичай EditText), взявши його параметри. Це робить його більш корисною функцією

для отримання додаткової інформації про InputMethodManager.SHOW_IMPLICIT та SHOW_FORCED; InputMethodManager


1

Це необхідний вихідний код:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

Детальніше пройдіть за цим посиланням. Це мені допомогло. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Використовуйте наведений вище код у onResume (), щоб відкрити м'яку клавіатуру


1

Подібно до відповіді @ShimonDoodkin, це те, що я зробив у фрагменті.

https://stackoverflow.com/a/29229865/2413303

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

Де ShowKeyboardє

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

Після успішного введення я також переконуюсь, що я приховав клавіатуру

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

1
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}

0

Відповідей уже надто багато, але крім мене нічого не вийшло

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

Я використовував showSoftInputсSHOW_FORCED

І моя діяльність є

 android:windowSoftInputMode="stateVisible|adjustResize"

сподіваюся, що це комусь допоможе


0

Розмістіть цей метод у своїй базовій діяльності та використовуйте його для інших видів діяльності, як шарм

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.