splinter123
splinter123

Reputation: 1203

Scrollview does not shrink when soft keyboard is shown

I have a simple chat activity, with a message entry box at the top and then a scrollview with the message list. When the soft keyboard is opened, I want the scrollview to shrink so that the last message is not covered by the keyboard. This is my xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="8dp" >

<TextView
    android:id="@+id/chat_with"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:text="Chat with Gordon" />

<RelativeLayout
    android:id="@+id/msg_container"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/chat_with"
    android:layout_marginTop="10dp">

    <EditText
        android:id="@+id/chat_message"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Type your message" />

    <ImageButton
        android:id="@+id/chat_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="#00000000"
        android:src="@+android:drawable/ic_menu_send" />
</RelativeLayout>



<ScrollView
    android:id="@+id/chat_container"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/msg_container"
    android:layout_marginTop="15dp"
    android:padding="10dp" 
    android:isScrollContainer="true"
    >

    <RelativeLayout
        android:id="@+id/chat_text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        >

        <TextView
            android:id="@+id/msg1"          
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hi, how are you?" 
            android:layout_alignParentRight="true"/>

        <TextView
            android:id="@+id/msg2"  
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="hey! All right" 
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/msg1"/>



    </RelativeLayout>

</ScrollView>

</RelativeLayout>

I just manually inserted two messages but there will be many of them in the real app. I already tried with the adjustPan|adjustResize solution, but it does not work, when I fire the keyboard the layout is unchanged and the last messages are covered by the keyboard. How can I avoid this? Thanks for your help!

Upvotes: 1

Views: 1679

Answers (1)

Gravitoid
Gravitoid

Reputation: 1392

I solved this problem by using the manifest. In the activity I used:

        android:windowSoftInputMode="stateHidden|adjustResize"

This way the keyboard starts out hidden and then when the user clicks in the EditText the keyboard will show up and the rest of the screen gets resized.

Look into the windowSoftInputMode for other settings for keyboard behavior (e.g. just covering up screen instead of resizing).

Edit: To scroll the scroll view to the bottom after the keyboard shows up I needed to use a slight delay because sometimes the scroll would happen first and then the keyboard showed up and the scroll view was no longer at the bottom. I ended up not keeping this for other reasons, but to delay the scroll a bit one can do this:

    // now scroll to the bottom
    ScrollView sv = (ScrollView) findViewById(R.id.myScrollView);
    sv.post(new Runnable() {
        @Override

        public void run() {

            ScrollView sv = (ScrollView) findViewById(R.id.myScrollView);
            sv.scrollTo(0, sv.getBottom());

        }
    });

Upvotes: 1

Related Questions