Android: soft keyboard pushes up whole layout, need to resize the listview
android, android-layout, android-listview
Solution
okay so I actually solved this myself, but I think this is not more than a hack so I might be revisit this at a later point. but the point is it works (tested this on a Galaxy S4)
I resize my listView according to the height of the displayed softKeyboard and resize it back once the keyboard is gone.
private static boolean keyboardHidden = true;
private static int reduceHeight = 0;
//...
//...
final View decorView = this.getWindow().getDecorView();
decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
int displayHeight = rect.bottom - rect.top;
int height = decorView.getHeight();
boolean keyboardHiddenTemp = (double)displayHeight / height > 0.8 ;
int mylistviewHeight = mylistview.getMeasuredHeight();
if (keyboardHiddenTemp != keyboardHidden) {
keyboardHidden = keyboardHiddenTemp;
if (!keyboardHidden) {
reduceHeight = height - displayHeight;
LinearLayout.LayoutParams mParam = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,mylistviewHeight - reduceHeight);
mylistview.setLayoutParams(mParam);
mylistview.requestLayout();
} else {
LinearLayout.LayoutParams mParam = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,mylistviewHeight + reduceHeight);
mylistview.setLayoutParams(mParam);
mylistview.requestLayout();
}
}
}
});
Problem
I have a full screen chat layout where I have a header with a logo on the top, then follows a listView with all chat messages and at the bottom I have the editText and the buttom to send the chat message. Now what happens when I click in the editText is, that the whole layout gets pushed up. What I need is, the header with the logo to always stay where they are and the listView to gets resized. this does not do the trick: ``` android:windowSoftInputMode="adjustResize" ``` this neither: ``` android:windowSoftInputMode="adjustPan" ``` maybe because I have a full screen layout? I need to find a different way to resize my listView once a keyboard is present, any ideas? Thanks in advance! Here is my layout ``` <LinearLayout android:layout_width="match_parent" android:layout_height="70dp" android:background="@drawable/ss99_yellow_area_navigation_bar" android:baselineAligned="false" android:orientation="horizontal" > <ImageView android:id="@+id/back" android:layout_width="45dp" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:layout_marginLeft="5dp" android:layout_marginTop="5dp" android:adjustViewBounds="true" android:clickable="true" android:src="@drawable/ss99_button_back" /> <ImageView android:id="@+id/logo" android:layout_width="wrap_content" android:layout_height="75dp" android:layout_weight="1" android:adjustViewBounds="true" android:src="@drawable/ss99_logo_small" /> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="45dp" android:layout_marginTop="-2dp" android:background="@drawable/ss9_yellow_bar_chat_new" > <TextView android:id="@+id/userOpponent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="5dp" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/userUser" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/userOpponent" android:layout_alignBottom="@+id/userOpponent" android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </RelativeLayout> <ListView android:id="@+id/chatList" android:layout_width="fill_parent" android:layout_height="wrap_content" android:cacheColorHint="#00000000" android:divider="#00000000" android:listSelector="#00000000" android:layout_weight="1" android:stackFromBottom="true" android:transcriptMode="alwaysScroll"> </ListView> <RelativeLayout android:layout_width="match_parent" android:layout_height="60dp" android:background="@drawable/ss9_yellow_area_for_bottom_and_chat_string" > <ImageView android:id="@+id/field1" android:layout_width="220dp" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_gravity="center" android:layout_marginLeft="20dp" android:layout_marginTop="10dp" android:adjustViewBounds="true" android:scaleType="centerInside" android:src="@drawable/ss1_field_big" /> <EditText android:id="@+id/chatEdit" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_alignBottom="@+id/field1" android:layout_alignLeft="@+id/field1" android:layout_alignTop="@+id/field1" android:layout_marginBottom="3dp" android:layout_marginLeft="10dp" android:layout_marginTop="1dp" android:background="@null" android:inputType="textAutoCorrect|textAutoComplete" android:textAppearance="?android:attr/textAppearanceMedium" > </EditText> <ImageView android:id="@+id/chatOk" android:layout_width="60dp" android:layout_height="60dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginBottom="5dp" android:adjustViewBounds="false" android:baselineAlignBottom="false" android:clickable="true" android:cropToPadding="false" android:scaleType="fitEnd" android:src="@drawable/ss4_button_go_small" /> </RelativeLayout> </LinearLayout> ```