40

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

Текущий Компоновка ...

<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> 

ответ

40

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

+0

Спасибо! Спас мой день! У меня было поле ввода webview, перекрываемое клавиатурой. Удаление полноэкранного режима решило его. – tarkeshwar

+2

Спасибо! У меня была такая же проблема, но все, что попало в scrollView, тоже не решило проблему. Таким образом, кажется, что удаление полноэкранного флага - единственный способ избавиться от этой ошибки. – yahya

+0

проверьте простой ответ @usman ниже. Работает для полного экрана – usman

0

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

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

это сработало для меня. не помещал windowSoftInputMode в макет. так как я уже объявляю android: fitsSystemWindows = "true" в другом представлении, я не могу поместить его туда, где ему нужно было работать в макете. благодаря! – styler1972

1

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

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

У меня это есть, и я пытаюсь удалить его, но я не знаю, откуда это происходит. У моего config.xml нет ссылки на это –

+0

Прошло пару лет с тех пор, как у меня была эта проблема, но я думаю, что код выше был в моем файле AndroidManifest.xml. – JeffRegan

+0

Я не могу отредактировать этот файл, мне нужно изменить config.xml, который генерирует другой, но у меня его нет. Но в любом случае. удаление этого из AndroidManifest.xml тоже не сработало, но не беспокойтесь, это уже довольно давно –

1

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

-8

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

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

Неверный ответ. Пожалуйста, исправьте этот ответ. –

7

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

+0

Thumbs up for much clarification Я бил свою голову с некоторых дней, когда я использовал полноэкранный режим для своего приложения. –

Смежные вопросы