Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android EditText Multiline with SoftInputMode adjustPan

I have an activity to edit some text with a top bar a EditText view in multiline mode inside a scrollview. At the bottom another view with 2 buttons. What I wanted to achieve is when editing the text that bottom bar would be below the softkeyboard. That is easy using android:windowSoftInputMode="adjustPan" in the manifest. The problem is if the edittext becomes big enough with several lines, when editing the topbar it disappears. This only occurs when using adjustPan mode. But the worst and I think it's a bug, its when the cursor is at the end of the edittext view and scrolling up using the D-Pad joystick all the layout is pulled to the top.

This is the screen without focus on the EditText: http://i.stack.imgur.com/pFadV.png

When the bug occurs with the scrolling, this happens: http://i.stack.imgur.com/eS8PP.png

My layout is the following:

   <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/BackgroundGray"
    android:gravity="top|center"
    android:orientation="vertical"
    android:windowSoftInputMode="adjustPan" >

    <RelativeLayout
        android:id="@+id/top_bar"
        android:layout_width="fill_parent"
        android:layout_height="45dip"
        android:layout_alignParentTop="true"
        android:background="@drawable/top_bar"
        android:focusable="true"
        android:focusableInTouchMode="true" >

        <ImageView
            android:id="@+id/bar_item_priority"
            android:layout_width="4dip"
            android:layout_height="34dip"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:contentDescription="@string/priority" />

        <EditText
            android:id="@+id/bar_title"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="6dip"
            android:background="@android:color/transparent"
            android:fadingEdge="vertical"
            android:gravity="center_vertical|left"
            android:hint="@string/default_title"
            android:inputType="text|textCapSentences"
            android:paddingLeft="10dip"
            android:textColor="#f3f3f3"
            android:textColorHint="#20ffffff"
            android:textSize="20dip"
            android:textStyle="bold" >
        </EditText>
    </RelativeLayout>

    <View
        android:id="@+id/main_top_bar_shadow"
        android:layout_width="fill_parent"
        android:layout_height="1dip"
        android:layout_below="@+id/top_bar"
        android:background="@color/TopBarShadow" />

    <LinearLayout
        android:id="@+id/meta_bar"
        android:layout_width="fill_parent"
        android:layout_height="25dip"
        android:layout_below="@+id/main_top_bar_shadow"
        android:background="#313435"
        android:descendantFocusability="blocksDescendants" >

        <TextView
            android:id="@+id/meta_date_modified"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="center_vertical|left"
            android:paddingLeft="10dip"
            android:paddingRight="10dip"
            android:paddingTop="6dip"
            android:shadowColor="#1d1d1d"
            android:shadowDx="1"
            android:shadowDy="1"
            android:shadowRadius="2"
            android:text="@string/default_date"
            android:textColor="#9d9d9d"
            android:textSize="12dip"
            android:textStyle="bold" >
        </TextView>
    </LinearLayout>

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/bottom_bar"
        android:layout_below="@+id/meta_bar"
        android:fillViewport="true"
        android:scrollbarSize="2dip"
        android:scrollbarThumbHorizontal="@drawable/scrollbar"
        android:scrollbarThumbVertical="@drawable/scrollbar"
        android:scrollbars="vertical" >

        <view
            android:id="@+id/note"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:capitalize="sentences"
            class="home.greven.notes.NoteEditor$LinedEditText"
            android:fadingEdge="vertical"
            android:gravity="top"
            android:paddingBottom="8dip"
            android:paddingLeft="11dip"
            android:paddingRight="11dip"
            android:paddingTop="8dip"
            android:textSize="16sp" >
        </view>
    </ScrollView>

    <View
        android:id="@+id/bottom_bar_shadow"
        android:layout_width="fill_parent"
        android:layout_height="1dip"
        android:layout_above="@+id/bottom_bar"
        android:background="@color/TopBarShadow"
        android:focusable="false"
        android:focusableInTouchMode="false" />

    <LinearLayout
        android:id="@+id/bottom_bar"
        android:layout_width="fill_parent"
        android:layout_height="40dip"
        android:layout_alignParentBottom="true"
        android:background="@drawable/bottom_buttons_bar"
        android:descendantFocusability="blocksDescendants" >

        <Button
            android:id="@+id/bottom_bar_button_plaintext"
            style="@style/NoteEditorButtonText"
            android:layout_width="0.0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_margin="4dip"
            android:layout_weight="0.5"
            android:background="@drawable/small_blue_buttonstates"
            android:text="@string/plain_text" />

        <Button
            android:id="@+id/bottom_bar_button_checklist"
            style="@style/NoteEditorButtonText"
            android:layout_width="0.0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_margin="4dip"
            android:layout_weight="0.5"
            android:background="@drawable/small_gray_buttonstates"
            android:onClick="toChecklist"
            android:text="@string/checklist" />
    </LinearLayout>

</RelativeLayout>

If I use adjustResize in android:windowSoftInputMode everything works well but then the bottom bar will be visible when editing, something I didn't want to happen. I think this scrolling issue is an Android bug. Any help would be very appreciated!

like image 480
greven Avatar asked Jan 08 '12 00:01

greven


1 Answers

I do have the same problem with the button at the bottom. After days of googling i found this is due to the missing

  android:isScrollContainer="false"

in the ScrollView.

Android document mention this

Set this if the view will serve as a scrolling container, meaing that it can be resized to shrink its overall window so that there will be space for an input method.

Edit: Also check this Answer

like image 144
droid kid Avatar answered Sep 29 '22 14:09

droid kid