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

Original source