Android EditText被軟鍵盤遮蓋的處理方法_Android

來源:互聯網
上載者:User

這兩天android app新增了透明欄效果,結果發現鍵盤彈起後會遮蓋螢幕底部的EditText,沒有像想象中的調整視窗大小,並滾動ScrollView,將EditText顯示在鍵盤上方。之前也遇到過類似問題,所以解決後就乾脆寫把所有關於EditText和鍵盤之間問題和解決思路都記錄一下,以便以後查閱。

  一、在5.0以前,如果EditText設定了gravity=“center|right”其中之一且同時設定了singleLine=“true”,就會導致螢幕底部的EditText連續點擊彈出鍵盤時,從第二次開會一直遮擋住EditText。

  5.0+則不會有該問題,解決辦法也簡單,在EditText外層包裹ScrollView,並設定鍵盤模式為adjustResize模式即可(兩者缺一不可)。

  二、按上面描述的解決辦法,一直沒什麼問題,直到最近加了透明欄效果,鍵盤模式彷彿直接失效,每次點擊底部EditText時,鍵盤都從底部彈起,視窗大小也不會調整,底部EditText也會被遮蓋。最後發現是當使用getWindow().getDecorView().setSystemUiVisibility方法設定了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ,或者設定了 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)時,會引發EditText被鍵盤遮蓋問題。

  因為透明欄效果是從4.4開始支援,也就導致從4.4開始項目就存在這個BUG,當然只考慮5.0+的透明欄效果,可以直接設定狀態列顏色實現透明欄效果,我這裡由於項目需要必須要從4.4開始支援,所以必須解決這個問題。

  正常情況下,系統UI會佔用app一些空間,例如狀態列、鍵盤、導覽列等,也就是說我們的app UI不會出現在系統UI之下,但從測試結果來看,為了佔用狀態列空間或全屏,設定了上面的一些屬性後,就會被系統UI覆蓋。

  解決方案:

監聽介面容器的layout變化,當發生變化時,通過檢查視窗可見地區高度,判斷鍵盤是否彈起,如果彈起,則修改容器bottom padding,也就是手動實現adjustResize效果,給鍵盤留出顯示空間,這樣ScrollView也會自動調整大小,將EditText顯示在鍵盤上方。

public class KeyboardPatch{ private Activity activity; private View decorView; private View contentView; /**  * 建構函式  * @param act 需要解決bug的activity  * @param contentView 介面容器,activity中一般是R.id.content,也可能是Fragment的容器,根據個人需要傳遞  * */ public KeyboardPatch(Activity act, View contentView) {  this.activity = act;  this.decorView = act.getWindow().getDecorView();  this.contentView = contentView; } /**  * 監聽layout變化  * */ public void enable() {  activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);  if (Build.VERSION.SDK_INT >= 19)  {   decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);  } } /**  * 取消監聽  * */ public void disable() {  activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);  if (Build.VERSION.SDK_INT >= 19)  {   decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);  } } private ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {  @Override  public void onGlobalLayout()  {   Rect r = new Rect();   decorView.getWindowVisibleDisplayFrame(r);   int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;   int diff = height - r.bottom;   if (diff != 0)   {    if (contentView.getPaddingBottom() != diff)    {     contentView.setPadding(0, 0, 0, diff);    }   }   else   {    if (contentView.getPaddingBottom() != 0)    {     contentView.setPadding(0, 0, 0, 0);    }   }  } };}

以上所述是小編給大家介紹的Android EditText被軟鍵盤遮蓋的處理方法,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.