Экран клавиатуры закрывает экран вместо того, чтобы выдвигать макет?

У меня проблема: когда я нажимаю на клавиатуру, содержимое моего экрана не подталкивается – скорее, клавиатура просто перекрывает все (а именно, охватывает мой ListView ) на моем экране. Это структура моего макета:

 <ScrollView> <RelativeLayout> </RelativeLayout> </ScrollView> <ListView> </ListView> <LinearLayout> <EditText></EditText> </LinearLayout> 

Я ScrollView свой RelativeLayout в ScrollView потому что думал, что сделает весь мой макет прокручиваемым, что «подтолкнет» все макеты, чтобы пользователь мог просматривать эти части, набирая свой ответ. Я также имею в своем AndroidManifest.xml: android:windowSoftInputMode="adjustResize|stateVisible|stateAlwaysHidden" Вот изображение того, что происходит:

Изображение происходящего

И вот мой код. Любая помощь будет оценена!

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" xmlns:fresco="http://schemas.android.com/tools" android:id="@+id/comments_coordinator_layout"> <android.support.design.widget.AppBarLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/comments_appbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/comments_coordinator_layout" > <RelativeLayout android:layout_marginTop="?attr/actionBarSize" android:id="@+id/view_post" android:layout_width="match_parent" android:paddingRight="5dp" android:paddingLeft="5dp" android:orientation="horizontal" android:layout_height="175dp" android:background="#e6e6e6"> <com.facebook.drawee.view.SimpleDraweeView android:layout_marginTop="15dp" android:id="@+id/poster_picture" android:layout_width="75dp" android:layout_height="75dp" android:layout_marginLeft="10dp" fresco:placeholderImage="@mipmap/blank_prof_pic" fresco:roundedCornerRadius="5dp" /> <TextView android:layout_marginLeft="5dp" android:layout_marginTop="15dp" android:layout_toRightOf="@id/poster_picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15sp" android:textStyle="bold" android:id="@+id/poster_name"/> <TextView android:layout_alignParentRight="true" android:layout_marginTop="15dp" android:layout_toRightOf="@id/poster_name" android:layout_marginLeft="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15sp" android:id="@+id/post_date"/> <TextView android:layout_marginLeft="5dp" android:layout_toRightOf="@id/poster_picture" android:layout_below="@id/poster_name" android:textSize="20sp" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/view_status" /> </RelativeLayout> </ScrollView> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:layout_marginTop="225dp" android:id="@+id/lv_comments_feed" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/send_message"> </ListView> <LinearLayout android:id="@+id/send_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:layout_alignParentBottom="true" android:orientation="horizontal" > <EditText android:id="@+id/write_comment" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:layout_weight="5" android:gravity="top|left" android:hint="Comment back!" android:inputType="textMultiLine" android:scrollHorizontally="false" /> <Button android:id="@+id/send_comment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:gravity="center" android:text="send" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> </RelativeLayout> </android.support.design.widget.CoordinatorLayout> 

EDIT: Моя попытка добавить родительский LinearLayout для ScrollView . Теперь проблема: The vertically scrolling ScrollView should not contain another vertically scrolling widget когда я The vertically scrolling ScrollView should not contain another vertically scrolling widget курсор на ListView

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" xmlns:fresco="http://schemas.android.com/tools" android:id="@+id/comments_coordinator_layout"> <android.support.design.widget.AppBarLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/comments_appbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/comments_coordinator_layout" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RelativeLayout android:layout_marginTop="?attr/actionBarSize" android:id="@+id/view_post" android:layout_width="match_parent" android:paddingRight="5dp" android:paddingLeft="5dp" android:orientation="horizontal" android:layout_height="175dp" android:background="#e6e6e6"> <com.facebook.drawee.view.SimpleDraweeView android:layout_marginTop="15dp" android:id="@+id/poster_picture" android:layout_width="75dp" android:layout_height="75dp" android:layout_marginLeft="10dp" fresco:placeholderImage="@mipmap/blank_prof_pic" fresco:roundedCornerRadius="5dp" /> <TextView android:layout_marginLeft="5dp" android:layout_marginTop="15dp" android:layout_toRightOf="@id/poster_picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15sp" android:textStyle="bold" android:id="@+id/poster_name"/> <TextView android:layout_alignParentRight="true" android:layout_marginTop="15dp" android:layout_toRightOf="@id/poster_name" android:layout_marginLeft="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15sp" android:id="@+id/post_date"/> <TextView android:layout_marginLeft="5dp" android:layout_toRightOf="@id/poster_picture" android:layout_below="@id/poster_name" android:textSize="20sp" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/view_status" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:layout_marginTop="225dp" android:id="@+id/lv_comments_feed" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/send_message"> </ListView> <LinearLayout android:id="@+id/send_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:layout_alignParentBottom="true" android:orientation="horizontal" > <EditText android:id="@+id/write_comment" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:layout_weight="5" android:gravity="top|left" android:hint="Comment back!" android:inputType="textMultiLine" android:scrollHorizontally="false" /> <Button android:id="@+id/send_comment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:gravity="center" android:text="send" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> </RelativeLayout> </LinearLayout> </ScrollView> </android.support.design.widget.CoordinatorLayout> 

EDIT: Я думаю, лучшим решением может быть создание пользовательского ListView …, который содержит тот же макет, который находится в каждом элементе ListView . Любые предложения или идеи о том, как это реализовать?

EDIT: Попробовал @ VanillaBoy ответ. Я знаю, что созданное изображение связано с тем, что у меня есть marginTop = 225 dp но даже если я его удалю, когда я нажимаю на свой EditText , он показывает только мой ListView и мой RelativeLayout выше скрыт Образ

РЕДАКТИРОВАТЬ: В соответствии с ответом @ Fllo, я все еще могу воспроизвести ошибку, которую я имел в начале с этим макетом, и вот что я имею в своем макете. Также, если это помогает моему манифесту Android выглядеть так android:windowSoftInputMode="adjustResize|stateAlwaysHidden"> .

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" xmlns:fresco="http://schemas.android.com/tools" android:id="@+id/comments_coordinator_layout"> <android.support.design.widget.AppBarLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/comments_appbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/comments_coordinator_layout" android:fillViewport="true" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RelativeLayout android:layout_marginTop="?attr/actionBarSize" android:id="@+id/view_post" android:layout_width="match_parent" android:paddingRight="5dp" android:paddingLeft="5dp" android:orientation="horizontal" android:layout_height="175dp" android:background="#e6e6e6"> <com.facebook.drawee.view.SimpleDraweeView android:layout_marginTop="15dp" android:id="@+id/poster_picture" android:layout_width="75dp" android:layout_height="75dp" android:layout_marginLeft="10dp" fresco:placeholderImage="@mipmap/blank_prof_pic" fresco:roundedCornerRadius="5dp" /> <TextView android:layout_marginLeft="5dp" android:layout_marginTop="15dp" android:layout_toRightOf="@id/poster_picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15sp" android:textStyle="bold" android:id="@+id/poster_name"/> <TextView android:layout_alignParentRight="true" android:layout_marginTop="15dp" android:layout_toRightOf="@id/poster_name" android:layout_marginLeft="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15sp" android:id="@+id/post_date"/> <TextView android:layout_marginLeft="5dp" android:layout_toRightOf="@id/poster_picture" android:layout_below="@id/poster_name" android:textSize="20sp" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/view_status" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:id="@+id/container_list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/send_message"> </LinearLayout> <LinearLayout android:id="@+id/send_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:layout_alignParentBottom="true" android:orientation="horizontal" > <EditText android:id="@+id/write_comment" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:layout_weight="5" android:gravity="top|left" android:hint="Comment back!" android:inputType="textMultiLine" android:scrollHorizontally="false" /> <Button android:id="@+id/send_comment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:gravity="center" android:text="send" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> </RelativeLayout> </LinearLayout> </ScrollView> </android.support.design.widget.CoordinatorLayout> 

Использование внутреннего ListView с ScrollView следует избегать в Android. Действительно, эти макеты имеют свои собственные прокрутки и жестов. Решения направлены на предотвращение жестов прокрутки в списке или вычисление высоты и расширение по умолчанию. Но это сделает слишком много работы и не будет уважать шаблон Android и рекомендации.

Вместо замены ListView на LinearLayout и сохранения LinearLayout родителя, как указывал мой старый ответ, я нашел возможное обходное решение, которое выполняет следующие действия:

  • Создайте свой собственный ListView
  • Переопределить onSizeChanged() который перерисовывает ListView при открытии клавиатуры
  • Получите lastVisiblePosition и lastVisiblePosition его высоту в предыдущем методе
  • Наконец, переместите список в предыдущее lastVisiblePosition и вычислите смещение
  • Кроме того, установите заголовок для контейнера заголовка заголовка
  • И вам нужно обновить высоту дочернего элемента до того, как пользователь откроет клавиатуру, чтобы вы могли обновить значение в onClickListener из EditText

И ему нужны такие макеты:

  • Деятельность макета:

     <CoordinatorLayout> <AppBarLayout> ... </AppBarLayout> <RelativeLayout> <CustomListView /> <LinearLayout> ... </LinearLayout> </RelativeLayout> </CoordinatorLayout> 
  • Макет заголовка (который будет выше списка):

     <RelativeLayout> <SimpleDraweeView /> <TextView /> ... </RelativeLayout> 

Хм, вот и все … Итак, хорошо идти:

Создать Listview :

 public class CustomListView extends ListView { // last height item variable (updated from Activity) public int lastItemHeight = 0; public CustomListView(Context context) { super(context, null); } public CustomListView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } } 

Переопределить onSizeChanged() :

 @Override protected void onSizeChanged(int w, final int h, int oldw, int oldh) { // save last position visible before resize final int lastPosition = super.getLastVisiblePosition(); // call super SizeChanged method super.onSizeChanged(w, h, oldw, oldh); // after resizing, show the last visible item at the bottom of new listview's height, above the edit text // see : http://developer.android.com/reference/android/widget/AbsListView.html#setSelectionFromTop(int, int) super.setSelectionFromTop(lastPosition, (h - lastItemHeight)); } 

Это все для ListView .
Переменная lastItemHeight будет обновляться, когда пользователь нажимает на вход (ниже списка, благодаря настройке вашего контейнера изображений заголовка в качестве headerView в вашей Activity ).

Теперь посмотрим на Activity :

Настройте свой собственный ListView и ваш Adapter :

 // get custom listview element final CustomListView list = (CustomListView) findViewById(R.id.container_list); // example items child ArrayList<String> items = new ArrayList<>(); for (int n=0; n<25; ++n) items.add("Blablabla n."+n); // example adapter ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.item_list_text_simple, android.R.id.text1, items); 

Создайте HeaderView и установите Adapter :

 // prepare the header content with picture View header = getLayoutInflater().inflate(R.layout.test_header_image, null); // set datas to the header elements (example) Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/fresco-logo.png"); SimpleDraweeView draweeView = (SimpleDraweeView) header.findViewById(R.id.poster_picture); draweeView.setImageURI(uri); // add the header to listview list.addHeaderView(header, null, false); // set the adapter list.setAdapter(adapter); 

Обращайтесь к экранной панели с помощью EditText.setOnClickListener :

 // when the user clicks on EditText... editMessage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // set a new Thread list.post(new Runnable() { @Override public void run() { // get last position of child int lastPosition = list.getLastVisiblePosition() - 1; // if the list can give the view's last child if (list.getChildAt(lastPosition) != null) { // update the height of the last child in custom listview list.lastItemHeight = list.getChildAt(lastPosition).getHeight(); } } }); } }); 

Вот и все для кода! И последнее: (Ow .. где заканчивается?), Вот макеты:

Основной вид Activity :

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/comments_coordinator_layout" android:fitsSystemWindows="true" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_height="wrap_content" android:layout_width="match_parent"> <android.support.v7.widget.Toolbar ... /> </android.support.design.widget.AppBarLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize"> <com.package.name.CustomListView android:id="@+id/container_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/send_message"/> <LinearLayout android:id="@+id/send_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:layout_alignParentBottom="true" android:orientation="horizontal" > <EditText ... /> <Button ... /> </LinearLayout> </RelativeLayout> </android.support.design.widget.CoordinatorLayout> 

Макет главы ListView :

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/view_post" android:layout_width="match_parent" android:layout_height="225dp" android:paddingRight="5dp" android:paddingLeft="5dp" android:orientation="horizontal" android:background="#e6e6e6"> <com.facebook.drawee.view.SimpleDraweeView ... /> <TextView ... /> <TextView ... /> <TextView ... /> </RelativeLayout> 

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

Надеюсь, вам это понравится;)

Добавьте это в свой манифест под действие

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