Автоматичне вискакує клавіатура при запуску Діяльність


97

У мене з’явилося відносно просте запитання. У мене є діяльність з великою кількістю EditText в них. Коли я відкриваю активність, він автоматично фокусується на першому EditText і відображає віртуальну клавіатуру.

Як я можу запобігти цьому?


Перевірте мою відповідь на це питання stackoverflow.com/questions/39593324/…
Android Help

Коли "Моя програма запущена" (відкрито), і якщо доступний перегляд тексту, доступно, клавіатура ввімкнена "Автоматичне" (показ). Як вирішити цю проблему, натисніть тут easycomacademy.com/…
AhmadUllah Ahmad

Відповіді:


209

Використовуйте ці атрибути в тезі макета у файлі XML:

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

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


3
Це вирішило і мою проблему. Я додав це до тегу RelativeLayout для своєї активності. Дякую!
Лука

21
Цікаво, що це не спрацювало, коли я додав вище в ScrollView, але він працював для LinearLayout
Джеррі Брейді

1
Я думаю, ви повинні поставити це на верхньому макеті
Utsav Gupta

Тож я гадаю, що це працює, тому що ви говорите самому макету, що він може мати фокус? Інакше передбачається, що їй потрібно зосередити увагу на першому контролі над формою? Як не дивно, я отримував клавіатуру, навіть якщо всі елементи управління в моїй формі були відключені. Виправлено зараз. Дякую!
crowmagnumb

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

96

Ви можете додати це до своєї діяльності Android Manifest:

android:windowSoftInputMode="stateHidden|adjustResize"

Це працює, однак якщо у вас є фон зображення і ви переживаєте, що ваша м'яка клавіатура скорочує такий фон зображення, використовуйтеandroid:windowSoftInputMode="stateHidden|adjustPan"
ArtiomLK

31

У мене є кілька описаних тут реалізацій, але тепер я додав у AndroidManifest.xmlсвою Activityвласність:

android:windowSoftInputMode="stateAlwaysHidden"

Я думаю, що це простий спосіб, навіть якщо ви користуєтесь fragments.

" stateAlwaysHidden " М'яка клавіатура завжди прихована, коли головне вікно діяльності має фокус на вході.


це працювало для мене як із ScrollView, так і з RelativeLayout.
iversoncru

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

11

Якщо у вас є інший погляд на вашу діяльність, наприклад ListView, ви також можете зробити:

ListView.requestFocus(); 

у своєму onResume (), щоб захопити фокус від editText.

Я знаю, що на це питання відповіли, але просто пропонували альтернативне рішення, яке працювало для мене :)



4

Використовуйте це в коді своєї діяльності:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Це не спрацювало для мене - клавіатура все-таки спливала, коли я починаю свою діяльність.
Девід Дорія

Ви можете перевірити це посилання, він буде працювати: stackoverflow.com/questions/18977187 / ...
Sujeet Kumar Gupta

3

У мене виникла проблема, навіть при переключенні вкладок клавіатура вискакувала автоматично і переставала працювати з Android 3.2.1 на планшеті. Використовуйте наступний метод:

public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);
    if (isFocused) {
        searchEditText.requestFocus();
    } else {
        InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
    }
}   

У активі onCreate () та onPause () для кожного EditText:

setEditTextFocus (myEditText, false);

Для кожного EditText an OnTouchListener:

    myEditText.setOnTouchListener(new EditText.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            setEditTextFocus(myEditText, true); 
            return false;
        }
    });

Для кожного EditTextв OnEditorActionListener:

    myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                            .......
            setEditTextFocus(myEditText, false); 
            return false;
        }
    });

І для кожного EditTextв layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

Можливо, можливо більше оптимізації коду.


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

використовуючи фрагмент ..це код працює, щоб приховати клавіатуру ... коли фрагмент відкритий, уникайте зосередження уваги на клавіатурі поля редагування тексту ...
Sreelal S

2

Я знайшов це просте рішення, яке працювало на мене. Встановіть ці атрибути у вашому батьківському макеті:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >

А тепер, коли діяльність розпочнеться, цей основний макет отримає фокус за замовчуванням.

Крім того, ми можемо видалити фокус із дочірніх поглядів під час виконання, надаючи фокус на основний макет знову, як це:

findViewById(R.id.mainLayout).requestFocus();

Сподіваємось, це спрацює для вас.


1

це рішення, яке я використовую, не найкраще рішення, але воно добре працює для мене

 editComment.setFocusableInTouchMode(false);
 editComment.setOnTouchListener(new OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                    // TODO Auto-generated method stub
                    editComment.setFocusableInTouchMode(true);
                     editComment.requestFocus() ;
                    return false;
                }});

1

Цікаво, що в цій документації https://developer.android.com/training/keyboard-input/visibility.html зазначено, що коли діяльність починається і фокус надається текстовому полі, м'яка клавіатура не відображається (а потім переходить до покаже вам, як показувати клавіатуру, якщо ви хочете, щоб мати якийсь код).

На моєму Samsung Galaxy S5 ось так працює моя програма (без явного запису чи конкретного коду) - без м’якої клавіатури. Однак на Lollipop AVD показана м'яка клавіатура, що суперечить доку, наведеному вище.

Якщо ви проявляєте таку поведінку під час тестування на AVD, можливо, ви захочете протестувати на реальному пристрої, щоб побачити, що відбувається.


1

На це є кілька хороших відповідей у ​​наступному дописі: Зупиніть EditText від уваги при запуску діяльності . Я регулярно використовую наступний код Моргана :

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext"     
    android:nextFocusLeft="@id/autotext"/>

ПРИМІТКА: Елемент манекена повинен бути розміщений ВПРАВНО, перш ніж фокусується елемент.

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


0

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

Це можна зробити у своєму макеті XML, не потрібен код ..


0

Прийнята відповідь не працює для мене, тому дайте відповідь робочим рішенням, можливо, це буде корисно!

EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();    
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Тепер клавіатура відкрита, насолоджуйтесь :)


Питання полягало в тому, як не допустити відкриття клавіатури.
jk7


0

Додайте код нижче у верхню частину XML діяльності та переконайтесь, що Перегляд знаходиться над EditText

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>

0

android:focusableInTouchMode="true"

Додайте вищезазначений рядок у xml EditTextабо, TextInputLayoutщо має фокус, і змушує softInputKeyboardспливаюче вікно.

Це вирішило проблему для нас, і тепер клавіатура не спливає


0

search_edit_text = (EditText) findViewById (R.id.search_edit_text);

    search_edit_text.requestFocus();
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Це працює для мене, хлопці, фрагмент може мати різний синтаксис. ЦІ РОБОТИ ДЛЯ ДІЯЛЬНОСТІ


Вам потрібно вказати будь-які обмеження, припущення чи спрощення у своїй відповіді. Детальніше про те, як відповісти за цим посиланням: stackoverflow.com/help/how-to-answer
Усаму Abdulrehman

-1

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

this.listView.requestFocus();

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

Наприклад, наприклад

this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();

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


Я це зробив, але вони все ще з'являються на клавіатурі, і фокус робиться на editText.
Девід Дорія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.