Android: soft keyboard pushes up whole layout, need to resize the listview
Asked Answered
U

3

7

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>
Uribe answered 28/5, 2014 at 8:18 Comment(2)
add your Layout in scrollviewGian
already thought of that but my layout has a listview, listvies and scrollviews dont play nice togetherUribe
U
3

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();


            }
        }

    }
}); 
Uribe answered 28/5, 2014 at 11:9 Comment(1)
it flies way to far off the screenAftercare
C
5

Try to add this to your activity in Manifest.xml

<activity
        android:windowSoftInputMode="stateVisible|adjustNothing">  
 </activity>
Canonicals answered 28/5, 2014 at 8:44 Comment(2)
not the desired effect, the layout remained at its position but now the keyboard is always visible and overlapping the editText. you can not see what you are typingUribe
Is it possible to get the keyboard height by using adjustNothing in the manifest file?Bombshell
U
3

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();


            }
        }

    }
}); 
Uribe answered 28/5, 2014 at 11:9 Comment(1)
it flies way to far off the screenAftercare
P
0

Add this to your activity

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

But for this to effect put the height of listview fill_parent

Purview answered 29/10, 2015 at 10:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.