天天看點

android 輸入框 布局

在做登入和注冊頁面的時候,經常會遇到諸如軟鍵盤擋住輸入框的情況,android為此提供了一系列的的配置參數供選擇,你可以在androidmanufist.xml的對應Activity的windowSoftInputMode屬性中選擇如下4者之一進行配置(紫色字):

       <activity android:name=".LoginAc"

                  android:label="@string/app_name"

                  android:windowSoftInputMode="stateHidden|adjustResize">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

四個參數意思如下:

這裡的多餘空間指的是控件們通過weight配置設定機制得到的額外空間。

圖1

圖2

圖3

代碼實作方式為:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);  

但是,這樣的配置方法一般都很難完全滿足需要,有得應用會做得比較好,讓頂上去的Layout能夠通過scrollbar滾動。這種解決方法網上有各種介紹,本人也是第一時間從網上找解決方法參考,但最終發現都并未把原理說清,而且大多數有錯誤,或者有多餘配置,于是,我從android系統中源碼中找參考案例,在Email應用中,找到了我想要的。效果如圖4,5。

圖4

圖5

其對應的Activity是AccountSetupBasics.java,對應的xml檔案為account_setup_basics.xml。

來學習下它的xml寫法:

<?xml version="1.0" encoding="utf-8"?>  

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  

    android:layout_width="fill_parent"  

    android:layout_height="fill_parent"  

    android:fillViewport="true"  

    android:scrollbarStyle="outsideInset" >  

    <LinearLayout  

        android:layout_width="fill_parent"  

        android:layout_height="fill_parent"  

        android:orientation="vertical" >  

        <LinearLayout  

            android:layout_width="fill_parent"  

            android:layout_height="wrap_content"  

            android:layout_weight="1"  

            android:orientation="vertical" >  

            <TextView  

                android:id="@+id/instructions"  

                android:layout_width="fill_parent"  

                android:layout_height="wrap_content"  

                android:layout_marginTop="10dip"  

                android:textSize="20sp"  

                android:text="@string/accounts_welcome"  

                android:textColor="?android:attr/textColorPrimary" />  

            <View  

                android:layout_height="0dip"  

                android:layout_weight="1" />  

            <EditText  

                android:id="@+id/account_email"  

                android:hint="@string/account_setup_basics_email_hint"  

                android:inputType="textEmailAddress"  

                android:imeOptions="actionNext"  

                android:layout_width="fill_parent" />  

                android:id="@+id/account_password"  

                android:hint="@string/account_setup_basics_password_hint"  

                android:inputType="textPassword"  

                android:imeOptions="actionDone"  

                android:nextFocusDown="@+id/next" />  

            <CheckBox  

                android:id="@+id/account_default"  

                android:text="@string/account_setup_basics_default_label"  

                android:visibility="gone" />  

        </LinearLayout>  

        <RelativeLayout  

            android:layout_height="54dip"  

            android:background="@android:drawable/bottom_bar" >  

            <Button  

                android:id="@+id/manual_setup"  

                android:text="@string/account_setup_basics_manual_setup_action"  

                android:layout_width="wrap_content"  

                android:minWidth="@dimen/button_minWidth"  

                android:layout_alignParentLeft="true"  

                android:layout_centerVertical="true" />  

                android:id="@+id/next"  

                android:text="@string/next_action"  

                android:drawableRight="@drawable/button_indicator_next"  

                android:layout_alignParentRight="true"  

        </RelativeLayout>  

    </LinearLayout>  

</ScrollView>  

1  它完全把ScrollView作為了一個根Layout,而不是網上好多文章寫的在一個Linearlayout裡面嵌入一個ScrollView(貌似這種是行不通的)。

然後把我們原來的根Layout搬入ScrollView(ScrollView隻能有一個子控件),我查了下androidmanifist.xml和代碼,未做任何以上2種方法的配置。

如此,完美的解決我們遇到的問題。

int

<a>SOFT_INPUT_ADJUST_NOTHING</a>

set to have a window not adjust for a shown input method.

<a>SOFT_INPUT_ADJUST_PAN</a>

set to have a window pan when an input method is shown, so it doesn't need to deal with resizing but just panned by

the framework to ensure the current input focus is visible.

<a>SOFT_INPUT_ADJUST_RESIZE</a>

set to allow the window to be resized when an input method is shown, so that its contents are not covered by the input method.

<a>SOFT_INPUT_ADJUST_UNSPECIFIED</a>

nothing specified.

繼續閱讀