欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android EditText被軟鍵盤(pán)遮蓋的處理方法

 更新時(shí)間:2016年10月14日 08:47:50   投稿:mrr  
android app新增了透明欄效果,結(jié)果發(fā)現(xiàn)鍵盤(pán)彈起后會(huì)遮蓋屏幕底部的EditText,沒(méi)有像想象中的調(diào)整窗口大小,并滾動(dòng)ScrollView,將EditText顯示在鍵盤(pán)上方。下面小編把解決方法記錄一下,特此分享到腳本之家平臺(tái),感興趣的朋友一起看看吧

這兩天android app新增了透明欄效果,結(jié)果發(fā)現(xiàn)鍵盤(pán)彈起后會(huì)遮蓋屏幕底部的EditText,沒(méi)有像想象中的調(diào)整窗口大小,并滾動(dòng)ScrollView,將EditText顯示在鍵盤(pán)上方。之前也遇到過(guò)類(lèi)似問(wèn)題,所以解決后就干脆寫(xiě)把所有關(guān)于EditText和鍵盤(pán)之間問(wèn)題和解決思路都記錄一下,以便以后查閱。

  一、在5.0以前,如果EditText設(shè)置了gravity=“center|right”其中之一且同時(shí)設(shè)置了singleLine=“true”,就會(huì)導(dǎo)致屏幕底部的EditText連續(xù)點(diǎn)擊彈出鍵盤(pán)時(shí),從第二次開(kāi)會(huì)一直遮擋住EditText。

  5.0+則不會(huì)有該問(wèn)題,解決辦法也簡(jiǎn)單,在EditText外層包裹ScrollView,并設(shè)置鍵盤(pán)模式為adjustResize模式即可(兩者缺一不可)。

  二、按上面描述的解決辦法,一直沒(méi)什么問(wèn)題,直到最近加了透明欄效果,鍵盤(pán)模式仿佛直接失效,每次點(diǎn)擊底部EditText時(shí),鍵盤(pán)都從底部彈起,窗口大小也不會(huì)調(diào)整,底部EditText也會(huì)被遮蓋。最后發(fā)現(xiàn)是當(dāng)使用getWindow().getDecorView().setSystemUiVisibility方法設(shè)置了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN或SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ,或者設(shè)置了 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)時(shí),會(huì)引發(fā)EditText被鍵盤(pán)遮蓋問(wèn)題。

  因?yàn)橥该鳈谛Ч菑?.4開(kāi)始支持,也就導(dǎo)致從4.4開(kāi)始項(xiàng)目就存在這個(gè)BUG,當(dāng)然只考慮5.0+的透明欄效果,可以直接設(shè)置狀態(tài)欄顏色實(shí)現(xiàn)透明欄效果,我這里由于項(xiàng)目需要必須要從4.4開(kāi)始支持,所以必須解決這個(gè)問(wèn)題。

  正常情況下,系統(tǒng)UI會(huì)占用app一些空間,例如狀態(tài)欄、鍵盤(pán)、導(dǎo)航欄等,也就是說(shuō)我們的app UI不會(huì)出現(xiàn)在系統(tǒng)UI之下,但從測(cè)試結(jié)果來(lái)看,為了占用狀態(tài)欄空間或全屏,設(shè)置了上面的一些屬性后,就會(huì)被系統(tǒng)UI覆蓋。

  解決方法:

監(jiān)聽(tīng)界面容器的layout變化,當(dāng)發(fā)生變化時(shí),通過(guò)檢查窗口可見(jiàn)區(qū)域高度,判斷鍵盤(pán)是否彈起,如果彈起,則修改容器bottom padding,也就是手動(dòng)實(shí)現(xiàn)adjustResize效果,給鍵盤(pán)留出顯示空間,這樣ScrollView也會(huì)自動(dòng)調(diào)整大小,將EditText顯示在鍵盤(pán)上方。

public class KeyboardPatch
{
 private Activity activity;
 private View decorView;
 private View contentView;
 /**
  * 構(gòu)造函數(shù)
  * @param act 需要解決bug的activity
  * @param contentView 界面容器,activity中一般是R.id.content,也可能是Fragment的容器,根據(jù)個(gè)人需要傳遞
  * */
 public KeyboardPatch(Activity act, View contentView)
 {
  this.activity = act;
  this.decorView = act.getWindow().getDecorView();
  this.contentView = contentView;
 }
 /**
  * 監(jiān)聽(tīng)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);
  }
 }
 /**
  * 取消監(jiān)聽(tīng)
  * */
 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被軟鍵盤(pán)遮蓋的處理方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評(píng)論