Intereting Posts
Программно принимать вызов в Нуге Медленные переходы на Android с аппаратным ускорением на Должен ли я создавать объекты Java Null? GetSerializableExtra возвращает null Xamarin Android Finalizer не получает вызов, когда вы покидаете активность, чтобы перейти на другую активность Горизонтальный вид прокрутки скрывает некоторых детей Альтернатива вложенным весам с помощью LinearLayouts Google Volley против Android-Async-Http Проблема в строчном массиве в XML-файле: множественные замены, указанные в непозиционном формате и тег </ item>, где ожидается </ string-array> Есть ли библиотека редактирования видео, доступная в Android Сообщение об аварии Firebase Crash Может ли кто-нибудь сказать, что использует начальную активность для результата в android Предотвращение нежелательной обертки строк в TextView Можно ли вызвать stopSelf () в Service.onStartCommand? Создайте файл PKCS # 12 с самозаверяющим сертификатом через OpenSSL в Windows для моего приложения для Android

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

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

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

Фактически, без 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 /> , а на некоторых устройствах клавиатура не появится. Надеюсь это поможет.