Android 軟鍵盤出現(xiàn)不適應(yīng)的解決辦法總結(jié)
Android 軟鍵盤出現(xiàn)不適應(yīng)的解決辦法總結(jié)
前言:
很多寫登錄界面的開發(fā)者都會(huì)遇到一個(gè)問題:那就是在登錄界面時(shí),當(dāng)你點(diǎn)擊輸入框時(shí),下邊的按鈕有時(shí)會(huì)被輸入框擋住,這個(gè)不利于用戶的體驗(yàn),所以很多人希望軟鍵盤彈出時(shí),也能把按鈕擠上去。很多開發(fā)者想要監(jiān)聽鍵盤的狀態(tài),這無(wú)疑是一個(gè)很麻煩的做法。
我們可以在AndroidManifest.xml的Activity設(shè)置屬性:Android:windowSoftInputMode = "adjustResize" ,軟鍵盤彈出時(shí),要對(duì)主窗口布局重新進(jìn)行布局,并調(diào)用onSizeChanged方法,切記一點(diǎn)當(dāng)我們?cè)O(shè)置為“adjustResize”時(shí),我們的界面不要設(shè)置為全屏模式,否則設(shè)置了這個(gè)屬性也不會(huì)有什么效果。而當(dāng)我們?cè)O(shè)置android: windowSoftInputMode = "adjustPan"時(shí),主窗口就不會(huì)調(diào)用onSizeChanged方法,界面的一部分就會(huì)被軟鍵盤覆蓋住,就不會(huì)被擠到軟鍵盤之上了。
我們通過一段代碼來(lái)測(cè)試一下,當(dāng)我們?cè)O(shè)置了該屬性后,彈出輸入法時(shí),系統(tǒng)做了什么:
重寫Layout布局:
public class ResizeLayout extends LinearLayout{ private static int count = 0; public ResizeLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); Log.e("onSizeChanged " + count++, "=>onResize called! w="+w + ",h="+h+",oldw="+oldw+",oldh="+oldh); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); Log.e("onLayout " + count++, "=>OnLayout called! l=" + l + ", t=" + t + ",r=" + r + ",b="+b); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); Log.e("onMeasure " + count++, "=>onMeasure called! widthMeasureSpec=" + widthMeasureSpec + ", heightMeasureSpec=" + heightMeasureSpec); }
我們的布局設(shè)置為:
<com.winuxxan.inputMethodTest.ResizeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" /> <LinearLayout android:id="@+id/bottom_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="bottom">s <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:background="#77777777" /> </LinearLayout> </com.winuxxan.inputMethodTest.ResizeLayout>
AndroidManifest.xml的Activity設(shè)置屬性:android:windowSoftInputMode = "adjustResize"
運(yùn)行程序,點(diǎn)擊文本框,查看調(diào)試信息:
E/onMeasure 6(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742024 E/onMeasure 7(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742025 E/onSizeChanged 8(7960): =>onSizeChanged called! w=320,h=201,oldw=320,oldh=377 E/onLayout 9(7960): =>OnLayout called! l=0, t=0,r=320,b=201
從調(diào)試結(jié)果我們可以看出,當(dāng)我們點(diǎn)擊文本框后,根布局調(diào)用了onMeasure,onSizeChanged和onLayout。
windowSoftInputMode的值如果設(shè)置為adjustPan,那么該Activity主窗口并不調(diào)整屏幕的大小以便留出軟鍵盤的空間。相反,當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分。這個(gè)通常是不期望比調(diào)整大小,因?yàn)橛脩艨赡荜P(guān)閉軟鍵盤以便獲得與被覆蓋內(nèi)容的交互操作。
上面的例子中,我們將AndroidManifest.xml的屬性進(jìn)行更改:android: windowSoftInputMode = "adjustPan"
重新運(yùn)行,并點(diǎn)擊文本框,查看調(diào)試信息:
E/onMeasure 6(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742200 E/onMeasure 7(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742201 E/onLayout 8(8378): =>OnLayout called! l=0, t=0,r=320,b=377
我們看到:系統(tǒng)也重新進(jìn)行了measrue和layout,但是我們發(fā)現(xiàn),layout過程中onSizeChanged并沒有調(diào)用,這說明輸入法彈出前后并沒有改變?cè)胁季值拇笮 ?br />
當(dāng)然還有其他屬性可以設(shè)置:
"stateUnspecified"
軟鍵盤的狀態(tài)(是否它是隱藏或可見)沒有被指定。系統(tǒng)將選擇一個(gè)合適的狀態(tài)或依賴于主題的設(shè)置。
這個(gè)是為了軟件盤行為默認(rèn)的設(shè)置。
"stateUnchanged"
軟鍵盤被保持無(wú)論它上次是什么狀態(tài),是否可見或隱藏,當(dāng)主窗口出現(xiàn)在前面時(shí)。
"stateHidden"
當(dāng)用戶選擇該Activity時(shí),軟鍵盤被隱藏——也就是,當(dāng)用戶確定導(dǎo)航到該Activity時(shí),而不是返回到它由于離開另一個(gè)Activity。
"stateAlwaysHidden"
軟鍵盤總是被隱藏的,當(dāng)該Activity主窗口獲取焦點(diǎn)時(shí)。
"stateVisible"
軟鍵盤是可見的,當(dāng)那個(gè)是正常合適的時(shí)(當(dāng)用戶導(dǎo)航到Activity主窗口時(shí))。
"stateAlwaysVisible"
當(dāng)用戶選擇這個(gè)Activity時(shí),軟鍵盤是可見的——也就是,也就是,當(dāng)用戶確定導(dǎo)航到該Activity時(shí),而不是返回到它由于離開另一個(gè)Activity。
"adjustUnspecified"
它不被指定是否該Activity主窗口調(diào)整大小以便留出軟鍵盤的空間,或是否窗口上的內(nèi)容得到屏幕上當(dāng)前的焦點(diǎn)是可見的。系統(tǒng)將自動(dòng)選擇這些模式中一種主要依賴于是否窗口的內(nèi)容有任何布局視圖能夠滾動(dòng)他們的內(nèi)容。如果有這樣的一個(gè)視圖,這個(gè)窗口將調(diào)整大小,這樣的假設(shè)可以使?jié)L動(dòng)窗口的內(nèi)容在一個(gè)較小的區(qū)域中可見的。這個(gè)是主窗口默認(rèn)的行為設(shè)置。
"adjustResize"
該Activity主窗口總是被調(diào)整屏幕的大小以便留出軟鍵盤的空間
"adjustPan"
該Activity主窗口并不調(diào)整屏幕的大小以便留出軟鍵盤的空間。相反,當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分。這個(gè)通常是不期望比調(diào)整大小,因?yàn)橛脩艨赡荜P(guān)閉軟鍵盤以便獲得與被覆蓋內(nèi)容的交互操作。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android Theme以及解決啟動(dòng)黑屏的方法詳解
這篇文章主要給大家介紹了關(guān)于Android Theme以及解決啟動(dòng)黑屏的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Android拼接實(shí)現(xiàn)動(dòng)態(tài)對(duì)象方法詳解
這篇文章主要為大家介紹了Android拼接實(shí)現(xiàn)動(dòng)態(tài)對(duì)象方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Android中封裝RecyclerView實(shí)現(xiàn)添加頭部和底部示例代碼
這篇文章主要給大家介紹了關(guān)于Android中封裝RecyclerView實(shí)現(xiàn)添加頭部和底部的相關(guān)資料,網(wǎng)上這方面的資料很多,但都不是自己需要的,索性自己寫一個(gè)分享出來(lái)供大家參考學(xué)習(xí),需要的朋友們下面隨著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-08-08詳細(xì)分析Android中onTouch事件傳遞機(jī)制
相信不少朋友在剛開始學(xué)習(xí)Android的時(shí)候,對(duì)于onTouch相關(guān)的事件一頭霧水。分不清onTouch(),onTouchEvent()和OnClick()之間的關(guān)系和先后順序,所以覺得有必要搞清onTouch事件傳遞的原理。經(jīng)過一段時(shí)間的琢磨以及相關(guān)博客的介紹,這篇文章就給大家詳細(xì)的分析介紹下。2016-10-10