android實現底部彈出框與軟鍵盤衝突(全面屏虛擬鍵適配)

船頭尺發表於2021-09-09

普通的底部彈出框大家都可以很熟練的使用了,無非是一個diaolog的事情,但是當dialog中含有輸入框之後,軟鍵盤與dialog的衝突可以說是十分坑了。。。更別說加上底部虛擬鍵了,這麼一個小功能磨得我簡直吐血。。。下面就是我的血淚史。 

第一階段:    

  首先是底部dialog與軟鍵盤的衝突:

       View myView = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop,null);
        myView.setPadding(0, 0, 0, 0);
        Dialog dialog = new AlertDialog.Builder(MainActivity.this)
                .setView(myView).create();
        //設定點選Dialog外部任意區域關閉Dialog
        dialog.setCanceledOnTouchOutside(true);
        dialog.show();
        Window window = dialog.getWindow();            
        win.getDecorView().setPadding(0, 0, 0, ScreenUtils.getNavigationBarHeight(this));
        WindowManager.LayoutParams lp = win.getAttributes();
       lp.width = WindowManager.LayoutParams.MATCH_PARENT;
       lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
       lp.gravity = Gravity.BOTTOM;//設定對話方塊置底部顯示

       win.setAttributes(lp);

      這時候dialog中的佈局檔案即R.layout.pop中含有edittext,每次我輸入後想關閉軟鍵盤,就順手點選diaolog外部區域,這下好了。。。不僅軟鍵盤關閉了,dialog也一起dimiss了。。。然後想著那就不讓點選Dialog外部任意區域關閉Dialog生效唄,就把 dialog.setCanceledOnTouchOutside(true);這行程式碼註釋掉,再執行,ok,我點即外部區域果然不會讓dialog消失,但問題是軟鍵盤也堅挺如初,毫不動搖,我手機自帶的輸入法當輸入中文時候沒有點選收起的小箭頭。。。這下怎麼搞。。。我想要點選外部diaolog不消失,只讓軟鍵盤消失啊!!!然後瘋狂百度,得到解決方法如下:

      不使用dialog而是使用dialogActivity,嘿嘿,這樣軟鍵盤總不會和dialog糾纏不清,同上同下了吧。

   setContentView(R.layout.activity_main); 


       //設定視窗對齊螢幕寬度

    Window win = this.getWindow();
    win.getDecorView().setPadding(0, 0, 0, 0);
    WindowManager.LayoutParams lp = win.getAttributes();
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
    lp.gravity = Gravity.BOTTOM;//設定對話方塊置頂顯示
    win.setAttributes(lp);
    //設定點選外部空白處可以關閉Activity,但我們不需要

    //this.setFinishOnTouchOutside(true); 

     當前activity要繼承自AppCompatActivity,然後重寫


@Overridepublic boolean onTouchEvent(MotionEvent event) {    // TODO Auto-generated method stub    if(event.getAction() == MotionEvent.ACTION_DOWN){        if(getCurrentFocus()!=null && getCurrentFocus().getWindowToken()!=null){
            InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);            manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);        }
    }    return super.onTouchEvent(event);}

  這樣,點選外部,就會讓軟鍵盤收起,且dialog不消失了(畢竟是activity了)

    當然,要在表單中註冊這個activity

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3016/viewspace-2801990/,如需轉載,請註明出處,否則將追究法律責任。

相關文章