AdjustPan не мешает клавиатуре покрывать EditText - PullRequest
44 голосов
/ 30 декабря 2010

Я пытаюсь создать довольно простой экран чата с 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>

Ответы [ 7 ]

49 голосов
/ 25 января 2011

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

29 голосов
/ 23 января 2014

В вашем файле манифеста вам нужно установить соответствующее свойство 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 Главное окно действия не изменяется, чтобы освободить место для программной клавиатуры. Скорее, содержимое окна автоматически панорамируется, так что текущий фокус никогда не скрывается клавиатурой, и пользователи всегда могут видеть, что они печатают. Как правило, это менее желательно, чем изменение размера, поскольку пользователю может потребоваться закрыть экранную клавиатуру, чтобы получить доступ к скрытым частям окна и взаимодействовать с ними.
9 голосов
/ 27 октября 2015

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

1 голос
/ 11 сентября 2014

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

<supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="false"
        android:anyDensity="false" />
0 голосов
/ 12 июля 2015

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

<supports-screens
android:anyDensity="true"/>
0 голосов
/ 20 июня 2015

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

0 голосов
/ 09 октября 2011

Вот один обходной путь, который я нашел. Откройте проблемный текст редактирования и нажмите клавишу ВОЗВРАТА. Обратите внимание, что он сдвигает 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());
                }
            });
        }
...