Запобігайте показу клавіатури під час запуску діяльності


265

Я маю активність із Edit Textвкладом. Коли діяльність ініціалізована, відображається клавіатура Android. Як клавіатура може залишатися прихованою, поки користувач не сфокусує вхід?


93
у вашому маніфесті<activity android:windowSoftInputMode="stateHidden" ...>
idiottiger


1
Як користуватися разом android:windowSoftInputMode="adjustPan"?
János

4
@ János android: windowSoftInputMode = "коригуватиПан | держава приховано"
Олексій Страх

Відповідь на цей коментар, була відповідь я шукаю: stackoverflow.com/a/23605510/6942602
korchix

Відповіді:


436

Я думаю, що наступне може спрацювати

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

Раніше я використовував його для подібних речей.


Чи є спосіб встановити його як клавіатуру, яка має лише цифри? тобто клавіша 12Key?
Мохамед Хаміс

@MohamedKhamis input.setRawInputType (Configuration.KEYBOARD_12KEY);
blockwala

1
Так, це все ще працює. @SagarNayak, чому б ви хотіли приховати клавіатуру EditText? :) Це приховувати клавіатуру, коли починається діяльність, яка міститьEditText
Martynas

@Devealte через 7 років, і це працювало для мене, чи помістили ви його в onCreate?
Діма

@Dymas Так, і я це зафіксував декілька місяців тому :)
Devealte

180

Спробуйте також це -

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

В іншому випадку заявіть про свою активність у файлі маніфесту -

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
          android:label="@string/app_name"
          android:windowSoftInputMode="stateHidden"
          >

Якщо ви вже використовували android:windowSoftInputModeзначення типу, adjustResizeабо adjustPan, ви можете об'єднати два значення, наприклад:

<activity
        ...
        android:windowSoftInputMode="stateHidden|adjustPan"
        ...
        >

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


3
дякую за показ як у коді, так і в xml! Дійсно, це найправильніша відповідь! Тим більше, що, мабуть, 3 хвилини ви витратили на написання обох методів, які зробили вас не першими ;-)
eric

34

Сховати його для всіх видів діяльності з використанням теми

<style name="MyTheme" parent="Theme">
    <item name="android:windowSoftInputMode">stateHidden</item>
</style>

задайте тему

<application android:theme="@style/MyTheme">

як цей глобальний підхід.
Rm558

1
Це спрацювало, коли я використовував різні теми у різних місцях
nmxprime

22

Додайте ці два властивості до батьківського макета (наприклад: лінійна макет, відносна компонування)

android:focusable="false"
android:focusableInTouchMode="false" 

Це зробить трюк :)


2
Це не працює для мене, однак налаштування їх на trueроботу, відповідно до відповіді Джека Т. Чи була зміна поведінки в останніх версіях?
Протеан

На додаток до моєї відповіді, ви повинні перевірити інші властивості, які ви маєте в маніфесті, і на редагування тексту.
Король Мас

У мене просто основні властивості в них. Я не розумію, чому налаштування цих falseфункцій має працювати, оскільки ідея полягає у тому, щоб відвести фокус від полів EditText.
Протеан

Може, це використовувалося для відведення фокусу від полів EditText, віддаляючи його від батьківського макета? Але вже не, здається.
Протеан

13

Спробуйте оголосити це у файлі menifest

<activity android:name=".HomeActivity"
      android:label="@string/app_name"
      android:windowSoftInputMode="stateAlwaysHidden"
      >

11

Якщо ви використовуєте API рівня 21, ви можете використовувати editText.setShowSoftInputOnFocus (помилково);



8

Просто додайте це у файл manifest.xml

<activity android:name=".MainActivity"
            android:windowSoftInputMode="stateHidden">

Ви все готові.


7

Ви також можете записати ці рядки коду в прямий батьківський макет .xml-файлу макета, в якому у вас є "проблема":

android:focusable="true"
android:focusableInTouchMode="true"

Наприклад:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ...
    android:focusable="true"
    android:focusableInTouchMode="true" >

    <EditText
        android:id="@+id/myEditText"
        ...
        android:hint="@string/write_here" />

    <Button
        android:id="@+id/button_ok"
        ...
        android:text="@string/ok" />
</LinearLayout>


Редагувати:

Приклад, якщо EditText міститься в іншому макеті:

<?xml version="1.0" encoding="utf-8"?>
<ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    ... >                                            <!--not here-->

    ...    <!--other elements-->

    <LinearLayout
        android:id="@+id/theDirectParent"
        ...
        android:focusable="true"
        android:focusableInTouchMode="true" >        <!--here-->

        <EditText
            android:id="@+id/myEditText"
            ...
            android:hint="@string/write_here" />

        <Button
            android:id="@+id/button_ok"
            ...
            android:text="@string/ok" />
    </LinearLayout>

</ConstraintLayout>

Ключ полягає в тому, щоб переконатися, що EditText не фокусується безпосередньо.
До побачення! ;-)


6

Найкраще рішення для мене, вставте свій клас

@Override
public void onResume() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onResume();
}

@Override
public void onStart() {
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onStart();
}

3

Функція для приховування клавіатури.

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();

    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
}

Сховати клавіатуру у файлі AndroidManifext.xml

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:windowSoftInputMode="stateHidden">

3

Щоб поширитись на прийняту відповідь від @Lucas:

Зателефонуйте цьому зі своєї діяльності в одному з подій раннього життєвого циклу:

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

Приклад Котліна:

override fun onResume() {
  super.onResume()

  window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
}

2

Ви можете спробувати цей набір унікальний атрибут для кожного елемента

TextView mtextView = findViewById(R.id.myTextView);
mtextView.setShowSoftInputOnFocus(false);

Клавіатура не відображатиметься, коли елемент фокусується


Хоча це може відповісти на запитання авторів, у ньому відсутні деякі пояснювальні слова та / або посилання на документацію. Фрагменти сирого коду не дуже корисні без фраз навколо них. Ви також можете знайти, як написати гарну відповідь дуже корисно. Відредагуйте свою відповідь - З огляду
Нік

1
//to hide the soft keyboard
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);

0

просто додайте це до своєї діяльності:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
      if (getCurrentFocus() != null) {
           InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
           imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
      }
      return super.dispatchTouchEvent(ev);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.