在做登入和注冊頁面的時候,經常會遇到諸如軟鍵盤擋住輸入框的情況,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.