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> 

Solutions Collecting From Web of "AdjustPan не препятствует клавиатуре закрывать EditText"

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

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

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

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

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

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

Вот одно обходное решение, которое я нашел. Откройте проблемный 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()); } }); } 

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

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