Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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>
like image 561
Petros Mastrantonas Avatar asked May 28 '14 08:05

Petros Mastrantonas


People also ask

How do I make the keyboard softer on my Android?

By default, the soft keyboard may not appear on the emulator. If you want to test with the soft keyboard, be sure to open up the Android Virtual Device Manager ( Tools => Android => AVD Manager ) and uncheck "Enable Keyboard Input" for your emulator.

How do you prevent the keyboard pushes a widget up on flutter?

You can solve this problem by setting resizeToAvoidBottomInset: false in Scaffold() .

What is windowSoftInputMode?

The windowSoftInputMode attribute is set on the activity — usually through the Android manifest — and it specifies the way the onscreen keyboard behaves when an activity comes into a user's focus.


2 Answers

Try to add this to your activity in Manifest.xml

<activity
        android:windowSoftInputMode="stateVisible|adjustNothing">  
 </activity>
like image 127
Pravesh Avatar answered Sep 23 '22 03:09

Pravesh


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


            }
        }

    }
}); 
like image 43
Petros Mastrantonas Avatar answered Sep 24 '22 03:09

Petros Mastrantonas