軟鍵盤

android:windowSoftInputMode說明:

stateUnspecified:軟鍵盤的狀態(tài)并沒有指定,系統(tǒng)將選擇一個(gè)合適的狀態(tài)或依賴于主題的設(shè)置

stateUnchanged:當(dāng)這個(gè)activity出現(xiàn)時(shí),軟鍵盤將一直保持在上一個(gè)activity里的狀態(tài),無論是隱藏還是顯示

stateHidden:用戶選擇activity時(shí),軟鍵盤總是被隱藏

stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點(diǎn)時(shí),軟鍵盤也總是被隱藏的

stateVisible:軟鍵盤通常是可見的

stateAlwaysVisible:用戶選擇activity時(shí),軟鍵盤總是顯示的狀態(tài)

adjustUnspecified:默認(rèn)設(shè)置,通常由系統(tǒng)自行決定是隱藏還是顯示

adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤的空間

adjustPan:當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤覆蓋和用戶能總是看到輸入內(nèi)容的部分

主要兩個(gè)

adjustPan:浮在屏幕 覆蓋輸入框會(huì)移動(dòng)屏幕露出輸入框(整體移動(dòng),造成界面顯示問題)
adjustResize:擠占界面 1、界面自身可以滾動(dòng)不會(huì)移動(dòng)屏幕(界面尺寸變化,有輸入框可以滾動(dòng)),2,界面不可滾動(dòng)會(huì)移動(dòng)屏幕露出輸入框。
adjustNothing: 沒變化

軟鍵盤彈出對View變化

DecorView 不會(huì)變化
R.id.content 會(huì)影響

mainView = ((ViewGroup)findViewById(android.R.id.content)).getChildAt(0);
        mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                if (mainView != null) {
                    mainView.getWindowVisibleDisplayFrame(r);//獲取可見
                    // check if the visible part of the screen is less than 85%
                    // if it is then the keyboard is showing
                    boolean newState = ((double)r.height() / (double)mainView.getRootView().getHeight()) < 0.85;
                    Log.v("Keyboard","r.height()  = "+ r.height() + "mainView.getHeight()  " + mainView.getHeight() +"  "+ findViewById(android.R.id.content).getHeight()+"   mainView.getRootView().getHeight()) = " + mainView.getRootView().getHeight());
//adjustPan        :V/Keyboard: r.height()  = 1051mainView.getHeight()  897  897   mainView.getRootView().getHeight()) = 1920
//adjustResize     :V/Keyboard: r.height()  = 1051mainView.getHeight()  1700  1700   mainView.getRootView().getHeight()) = 1920
//adjustUnspecified:V/Keyboard: r.height()  = 1051mainView.getHeight()  897  897   mainView.getRootView().getHeight()) = 1920
//adjustNothing    :不會(huì)執(zhí)行該監(jiān)聽
                    Log.v("Keyboard","mainView  = "+ mainView + "   mainView.getRootView() = " + mainView.getRootView());
                }
            }
        });
flutter影響

adjustPan 軟鍵盤浮在屏幕,屏幕不會(huì)移動(dòng),會(huì)覆蓋輸入框
adjustResize:軟鍵盤擠占界面,輸入框會(huì)被頂上去(可以通過監(jiān)聽界面變化來監(jiān)聽是否彈出軟鍵盤)

flutter 彈出軟鍵盤,setState()刷新界面,軟鍵盤又關(guān)閉的bug(界面結(jié)構(gòu)改變)。

例如:


  getBottomPanel(){
    if(showBottomExtendPanel){//showBottomExtendPanel
      return Column(
        children: <Widget>[
          _getBottomSimple(),//TextField
          Container(
            height: keyboardHeight + 64,
            child: Center(child: GestureDetector(onTap: (){
              _sendSugarBot();},child: Text('我的擴(kuò)展板',style: TextStyle(color: Colors.black),),),),
          )
        ],
      );
    }else{
      return Column(
        children: <Widget>[
          _getBottomSimple(),//這種成功,是TextField樹結(jié)構(gòu)沒有變,沒有創(chuàng)建新的Element,而是使用原來的Element
          Container(),
        ],
      );
/////return _getBottomSimple();TextField  這種就會(huì)導(dǎo)致鍵盤取消,猜測原因是showBottomExtendPanel狀態(tài)改變,由上面?zhèn)€Colume->TextField結(jié)構(gòu)變成只有TextField結(jié)構(gòu),導(dǎo)致重新創(chuàng)建TextField,焦點(diǎn)失去
    }
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容