Intereting Posts
Как отключить элемент click для определенных позиций в режиме сетки в android Android-пользовательский ListView с ImageButton не получает фокус Как отладить собственное приложение для Android? Android ACTION_GET_CONTENT не обновляет файлы загружаемых файлов Места автозаполнения Код состояния 9001 Как добавить событие Click в Stack Layout или Frame Проверка в EditText позволяет использовать IP-адрес или веб-узел Url Select-multiple-images-from-android, как получить Uris? Предпочитайте размер растрового изображения от фактического Uri до загрузки по шкале Android, slidepanelayout vs navigationDrawer RegisterReceiver для вещания только в том случае, если он еще не зарегистрирован? Как создать свою собственную библиотеку Android и разместить ее Android получает высоту содержимого веб-обозревателя после рендеринга Где мы храним ключ / passphrase / salt для шифрования? Как просмотреть подробные данные определенного элемента списка

Почему мягкая клавиатура показывает или нет, когда начинается действие?

Сравнивая наш дизайн между разработчиками, мы обнаружили странное поведение. После некоторого анализа мы пошли на это наблюдение.

Когда начинается действие, в некоторых случаях появляется клавиатура, но иногда нет.

Фактически, без ScrollView , мягкая клавиатура не появляется по умолчанию в EditText .

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".TestActivity" > <EditText android:id="@+id/editText1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:inputType="text" > <requestFocus /> </EditText> </LinearLayout> 

Но когда мы добавляем ScrollView , мягкая клавиатура появляется по умолчанию.

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".TestActivity" > <ScrollView android:id="@+id/scrollView1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" > <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="text" > <requestFocus /> </EditText> </ScrollView> </LinearLayout> 

Это зависит только от наличия ScrollView . Мы можем исправить это с помощью специального объявления в AndroidManifest , но это поведение по умолчанию.

Я и мой коллега-разработчик удивляются, почему это происходит?

Solutions Collecting From Web of "Почему мягкая клавиатура показывает или нет, когда начинается действие?"

Вот что я понимаю об этой проблеме после копания в коде Android и создания некоторых тестовых макетов с помощью EditText .

Поскольку ScrollView определяется как

  public class More ...ScrollView extends FrameLayout { ... } 

Я попытался использовать FrameLayout в качестве контейнера для элемента EditText . В результате не запускается программная клавиатура.

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/editText1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:inputType="text" > <requestFocus /> </EditText> </FrameLayout> 

Но, как написано в вопросе, использование ScrollView запускает программную клавиатуру (я упростил источник xml).

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/editText1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:inputType="text" > <requestFocus /> </EditText> </ScrollView> 

Таким образом, элемент, который позволяет запускать программную клавиатуру, находится в исходном файле ScrollView .

Edit: создав мой собственный класс MyFrameLayout расширяющий FrameLayout и играя с кодом, я обнаружил, что это что-то в стиле R.attr.scrollViewStyle по умолчанию ( R.attr.scrollViewStyle ), который отвечает за отображение клавиатуры или нет …

Edit2: наконец, атрибут android:scrollbars позволяют автоматически запускать клавиатуру при запуске, если они есть …

В моем случае андроид: полосы прокрутки исправили это, пока я не добавил:

 android:windowSoftInputMode="adjustResize"> 

Для прокрутки при отображении клавиатуры.

Чтобы иметь возможность использовать оба свойства, мне пришлось добавить:

 android:focusableInTouchMode="true" 

В дочернем элементе Scrollview

Я нашел focusableInTouchMode ответ здесь: Остановить EditText от получения фокуса при запуске Activity

Это связано с тем, что когда и приложение запускается, андроид фокусируется на первом доступном представлении. В первом случае это EditText, поэтому клавиатура всплывает. Во втором случае первое представление – это ScrollView, это первое представление, которое не требует клавиатуры, поэтому оно не отображается. Кроме того, в первом случае вы можете удалить <requestFocus /> , а на некоторых устройствах клавиатура не появится. Надеюсь это поможет.