android 軟鍵盤 輸入法 彈出引起的各種不適終極解決方案
引用自:http://blog.csdn.net/itachi85/article/details/6596284
android:windowSoftInputMode
activity主視窗與軟鍵盤的互動模式,可以用來避免輸入法皮膚遮擋問題,Android1.5後的一個新特性。
這個屬效能影響兩件事情:
【一】當有焦點產生時,軟鍵盤是隱藏還是顯示
【二】是否減少活動主視窗大小以便騰出空間放軟鍵盤
它的設定必須是下面列表中的一個值,或一個”state…”值加一個”adjust…”值的組合。在任一組設定多個值——多個”state…”values,例如&mdash有未定義的結果。各個值之間用|分開。例如:<activity android:windowSoftInputMode="stateVisible|adjustResize". . . >
在這設定的值(除"stateUnspecified"和"adjustUnspecified"以外)將覆蓋在主題中設定的值
各值的含義:
【A】stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設定
【B】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裡的狀態,無論是隱藏還是顯示
【C】stateHidden:使用者選擇activity時,軟鍵盤總是被隱藏
【D】stateAlwaysHidden:當該Activity主視窗獲取焦點時,軟鍵盤也總是被隱藏的
【E】stateVisible:軟鍵盤通常是可見的
【F】stateAlwaysVisible:使用者選擇activity時,軟鍵盤總是顯示的狀態
【G】adjustUnspecified:預設設定,通常由系統自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調整螢幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和使用者能總是看到輸入內容的部分
很多寫登入介面的開發者都會遇到一個問題:那就是在登入介面時,當你點選輸入框時,下邊的按鈕有時會被輸入框擋住,這個不利於使用者的體驗,所以很多人希望軟鍵盤彈出時,也能把按鈕擠上去。很多開發者想要監聽鍵盤的狀態,這無疑是一個很麻煩的做法。
我們可以在AndroidManifest.xml的Activity設定屬性:android:windowSoftInputMode = "adjustResize" ,軟鍵盤彈出時,要對主視窗布局重新進行佈局,並呼叫onSizeChanged方法,切記一點當我們設定為“adjustResize”時,我們的介面不要設定為全屏模式,否則設定了這個屬性也不會有什麼效果。而當我們設定android: windowSoftInputMode = "adjustPan"時,主視窗就不會呼叫onSizeChanged方法,介面的一部分就會被軟鍵盤覆蓋住,就不會被擠到軟鍵盤之上了。
我們通過一段程式碼來測試一下,當我們設定了該屬性後,彈出輸入法時,系統做了什麼:
重寫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);
- }
- <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>
執行程式,點選文字框,檢視除錯資訊:
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
從除錯結果我們可以看出,當我們點選文字框後,根佈局呼叫了onMeasure,onSizeChanged和onLayout。
windowSoftInputMode的值如果設定為adjustPan,那麼該Activity主視窗並不調整螢幕的大小以便留出軟鍵盤的空間。相反,當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和使用者能總是看到輸入內容的部分。這個通常是不期望比調整大小,因為使用者可能關閉軟鍵盤以便獲得與被覆蓋內容的互動操作。
上面的例子中,我們將AndroidManifest.xml的屬性進行更改:android: windowSoftInputMode = "adjustPan"
重新執行,並點選文字框,檢視除錯資訊:
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
我們看到:系統也重新進行了measrue和layout,但是我們發現,layout過程中onSizeChanged並沒有呼叫,這說明輸入法彈出前後並沒有改變原有佈局的大小。
當然還有其他屬性可以設定:
"stateUnspecified"
軟鍵盤的狀態(是否它是隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設定。
這個是為了軟體盤行為預設的設定。
"stateUnchanged"
軟鍵盤被保持無論它上次是什麼狀態,是否可見或隱藏,當主視窗出現在前面時。
"stateHidden"
當使用者選擇該Activity時,軟鍵盤被隱藏——也就是,當使用者確定導航到該Activity時,而不是返回到它由於離開另一個Activity。
"stateAlwaysHidden"
軟鍵盤總是被隱藏的,當該Activity主視窗獲取焦點時。
"stateVisible"
軟鍵盤是可見的,當那個是正常合適的時(當使用者導航到Activity主視窗時)。
"stateAlwaysVisible"
當使用者選擇這個Activity時,軟鍵盤是可見的——也就是,也就是,當使用者確定導航到該Activity時,而不是返回到它由於離開另一個Activity。
"adjustUnspecified"
它不被指定是否該Activity主視窗調整大小以便留出軟鍵盤的空間,或是否視窗上的內容得到螢幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴於是否視窗的內容有任何佈局檢視能夠滾動他們的內容。如果有這樣的一個檢視,這個視窗將調整大小,這樣的假設可以使滾動視窗的內容在一個較小的區域中可見的。這個是主視窗預設的行為設定。
"adjustResize"
該Activity主視窗總是被調整螢幕的大小以便留出軟鍵盤的空間
"adjustPan"
該Activity主視窗並不調整螢幕的大小以便留出軟鍵盤的空間。相反,當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和使用者能總是看到輸入內容的部分。這個通常是不期望比調整大小,因為使用者可能關閉軟鍵盤以便獲得與被覆蓋內容的互動操作。
相關文章
- Android輸入鍵盤隱藏解決方案Android
- Android中的EditText預設時不彈出軟鍵盤的方法Android
- Android軟鍵盤彈出,覆蓋h5頁面輸入框問題AndroidH5
- win10一按鍵盤各種彈出如何解決_為什麼win10一按鍵盤各種彈出內容Win10
- AndroidStudio3 輸入法不跟著游標問題終極解決方案Android
- Unity3D Android鍵盤輸入內容為白色解決方案Unity3DAndroid
- Android監聽軟鍵盤收起與彈出Android
- android實現底部彈出框與軟鍵盤衝突(全面屏虛擬鍵適配)Android
- Android 9.0 新增預置第三方輸入法/設定預設輸入法(軟鍵盤)Android
- VSCode彈窗無法應用,終端無法鍵入命令列解決方法VSCode命令列
- 輸入框跟隨鍵盤彈出/隱藏移動
- 今日頭條螢幕適配方案終極版:極低成本 Android 適配方案!Android
- h5鍵盤彈出收回導致位置錯亂解決方案H5
- win10玩遊戲老是彈出輸入法怎麼辦 玩遊戲shift鍵老彈出輸入法Win10遊戲
- 電腦鍵盤無法輸入任何東西怎麼解決
- web app 無限載入終極解決方案WebAPP
- Android開發之監聽軟鍵盤狀態(彈出收回)Android
- vm安裝win10 鍵盤無法輸入如何處理_vm安裝win10鍵盤無法輸入怎麼解決Win10
- Android多個EditText輸入效果解決方案Android
- win10鍵盤無法輸入任何東西 win10鍵盤無法輸入的方法Win10
- Mac無法清倒廢紙簍,終極解決方案Mac
- 短視訊平臺開發,點選輸入框時自動彈出軟鍵盤
- win10如何解除安裝極速輸入法 解除安裝極速輸入法的解決方法Win10
- android手機的微信H5彈出的軟鍵盤擋住了文字框,如何解決?AndroidH5
- Exception in thread “main” 終極解決方案ExceptionthreadAI
- win10遊戲裡輸入法總是自動彈出的解決方法Win10遊戲
- Win10電腦搜狗輸入法無法輸入中文及輸入法欄不見了的解決方法Win10
- 電腦鍵盤無法輸入任何東西怎麼解決 電腦鍵盤失靈怎麼辦
- 點選底部input輸入框,彈出的軟鍵盤擋住input(蘋果手機使用第三蘋果
- mac php環境終極解決方案MacPHP
- H5定位終極解決方案H5
- 終極自託管解決方案指南
- 前端(React)生成pdf終極解決方案(^_^)前端React
- Loguru:Python 日誌終極解決方案Python
- 同文輸入法更換鍵盤主題
- iOS WKWebView的javascript alert 不彈的解決方案iOSWebViewJavaScript
- flutter - 使用 SingleChildScrollView() 解決鍵盤遮擋輸入框的問題FlutterView
- ubuntu xubuntu 安裝xrdp 鍵盤滑鼠無法輸入問題 採用命令列解決辦法Ubuntu命令列
- win10系統鍵盤無法輸入怎麼回事 window10鍵盤無法輸入如何修復Win10