AdjustPan не препятствует клавиатуре закрывать EditText

Я пытаюсь создать довольно простой экран чата с ListView, отображающим текст и EditText внизу, и кнопку "Отправить" справа от EditText. Все функционально, но когда я нажимаю EditText, виртуальная клавиатура закрывает его. Экран поворачивается немного, но недостаточно, чтобы стать видимым над клавиатурой. У меня есть тег "adjustPan" в моем манифесте, а также пробовал тег "adjustResize" безрезультатно. Я предполагаю, что это связано с тем, как мой макет настроен, но я, честно говоря, понятия не имею. Пожалуйста, помогите!

Текущая компоновка...

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ListView android:id="@+id/android:list" 
    android:layout_height="0dip" 
    android:layout_width="fill_parent"
    android:layout_weight="1"
    android:stackFromBottom="true">
</ListView>

<LinearLayout android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <EditText android:id="@+id/sendMessageBox"
        android:focusable="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:scrollbars="vertical"
        android:maxLines="4"
        android:text=""
        android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine"
        android:maxLength="1000"
        android:hint="Type your message..."
        android:imeOptions="actionSend"/>

    <Button android:id="@+id/sendMessageButton" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:text="Send"/>

</LinearLayout>

Ответ 1

После многого поиска, по-видимому, это то, что я называю ошибкой. Если вы используете полноэкранный тег (чтобы удалить строку состояния из активности), вы не можете использовать "adjustResize" без переноса активности в ScrollView. К сожалению для меня я использую ListView, который создаст еще одну проблему. Мне надоело возиться с ним и, вероятно, просто откажутся от полноэкранного режима в этой деятельности.

Ответ 2

В вашем файле манифеста вам необходимо установить соответствующее свойство android:windowSoftInputMode. Этот атрибут действителен, так как API 3.

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

Параметры: http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft

  • stateUnspecified Состояние мягкой клавиатуры (скрыто или видимо) не указано. Система выберет подходящее состояние или будет полагаться на настройку в теме. Это настройка по умолчанию для мягкой клавиатуры.
  • stateUnchanged. Мягкая клавиатура хранится в любом состоянии, в котором она была последней, будь то видимой или скрытой, когда активность выходит на передний план.
  • "stateHidden" . Мягкая клавиатура скрыта, когда пользователь выбирает действие, то есть когда пользователь позитивно переходит вперед к активности, а не обращается к нему из-за оставления другого действия.
  • stateAlwaysHidden Мягкая клавиатура всегда скрыта, когда основное окно активности имеет фокус ввода.
  • stateVisible. Мягкая клавиатура видна, когда это нормально подходит (когда пользователь переходит к главному окну активности).
  • stateAlwaysVisible. Мягкая клавиатура становится видимой, когда пользователь выбирает действие, то есть когда пользователь утвердительно переходит вперед к активности, а не обращается к нему из-за оставления другого действия.
  • adjustUnspecified. Не указано, изменяется ли основное окно активности, чтобы освободить место для мягкой клавиатуры, или содержимое окна окна, чтобы сделать текущий фокус видимым на экране. Система будет автоматически выбирать один из этих режимов в зависимости от того, имеет ли содержимое окна какие-либо макеты, которые могут прокручивать их содержимое. Если есть такое представление, окно будет изменено, исходя из предположения, что прокрутка может сделать все содержимое окна видимым в меньшей области. Это настройка по умолчанию для основного окна.
  • adjustResize Основное окно активности всегда изменяется, чтобы освободить место для экранной клавиатуры.
  • adjustPan Основное окно операции не изменяется, чтобы освободить место для мягкой клавиатуры. Скорее, содержимое окна автоматически разворачивается так, что текущий фокус никогда не скрывается клавиатурой, и пользователи всегда могут видеть, что они набирают. Это, как правило, менее желательно, чем изменение размера, поскольку пользователю может понадобиться закрыть мягкую клавиатуру, чтобы получить доступ к скрытым частям окна и взаимодействовать с ним.

Ответ 3

если вы устанавливаете android:windowSoftInputMode="adjustResize" для активности в манифесте, тогда ScrollView (или другие сворачивающиеся группы представлений) будет уменьшаться для размещения мягкой клавиатуры. Но если вы задали android:windowFullscreen="true" в теме деятельности, тогда ScrollView не будет сокращаться, потому что он заставит заполнить весь экран. Однако установка android:fitsSystemWindows="false" в вашей теме также приводит к тому, что adjustResize не работает

Ответ 4

У меня это было в AndroidManifest. Это заставило adjustPan перестать работать правильно. Я удалил блок ниже, и все снова работает отлично.

<supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="false"
        android:anyDensity="false" />

Ответ 5

Попробуйте добавить android:windowSoftInputMode="adjustResize|stateVisible|stateAlwaysHidden" в ваш манифест.

Ответ 6

Вот одно обходное решение, которое я нашел. Откройте проблемный editText и нажмите клавишу RETURN. Обратите внимание, что сдвиг editText ближе к позиции, которую вы снимаете.

Итак, хотя взломанный, вы можете по-настоящему полюбить новую строку вверху edittext.

Это также, похоже, работает с использованием новой строки внизу, но вам придется использовать задержку, чтобы не добавлять новую строку, пока ПОСЛЕ того, как мягкая клавиатура не анимируется.

Примечание. У меня есть эта проблема только на некоторых телефонах (DroidX).

if (android.os.Build.MODEL.equals("DROIDX")) {
        inputEt.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                    String text = inputEt.getText().toString();
                    text = "\n\n" + text.trim();
                    inputEt.setText(text);  
                    inputEt.setSelection(text.length());
                }
            });
        }

Ответ 7

Вы можете попробовать следующие настройки:

<supports-screens
android:anyDensity="true"/>