EditText被軟鍵盤遮擋不可不知的小技巧

EditText被軟鍵盤遮擋解決方案

最后的效果就是標(biāo)題欄不被頂上去洋机,并且EditText不能被軟件盤遮擋睹限,廢話不多說,直接上代碼:

import android.app.Activity;
import android.graphics.Rect;
import android.os.Build;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;`
import android.view.WindowManager;
import android.widget.EditText;

import com.blankj.utilcode.util.KeyboardUtils;

public class KeyboardPatch {
    private Activity activity;
    private View decorView;
    private View contentView;
    private int srcPaddingBottm;
    private boolean keyboardVisiable;
    private int screenHeight;
    /**
     * @param act         需要解決bug的activity
     * @param contentView 界面容器芹彬,最好是可滑動(dòng)的View玻熙,比如ScrollView等
     */
    public KeyboardPatch(Activity act, View contentView) {
        this.activity = act;
        this.decorView = act.getWindow().getDecorView();
        this.contentView = contentView;
        srcPaddingBottm = contentView.getPaddingBottom();
        screenHeight = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
    }

    /**
     * 監(jiān)聽layout變化
     */
    public void enable() {
        //activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        if (Build.VERSION.SDK_INT >= 19) {
            decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
            //主要為了體驗(yàn)優(yōu)化,滑動(dòng)或者觸摸非焦點(diǎn)EditTexit的時(shí)候隱藏鍵盤宏多,當(dāng)然也可以去掉該監(jiān)聽
            contentView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
                        if (keyboardVisiable) {
                            KeyboardUtils.hideSoftInput(contentView);
                        }
                    }
                    return false;
                }
            });
        }
    }

    /**
     * 取消監(jiān)聽
     */
    public void disable() {
        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();
            //獲取可見窗口的frame儿惫,主要是獲取r.bottom
            decorView.getWindowVisibleDisplayFrame(r);
            //判斷軟鍵盤是否彈起
            keyboardVisiable = screenHeight - r.bottom >= 0;
            //尋找獲得焦點(diǎn)的view
            View focusView = decorView.findFocus();
            if (focusView != null && focusView instanceof EditText) {
                int[] location = new int[2];
                focusView.getLocationOnScreen(location);
                //如果focusView的高度很高的話,可以不必都顯示出來
                int focusBottom = location[1] + focusView.getMeasuredHeight();
                //獲取焦點(diǎn)的EditText的最底部和可見窗口的最底部的差值
                int diff = focusBottom - r.bottom;
                //如果大于0伸但,說明被遮擋了肾请,需要添加paddingBottom的值增加diff,并且需要把焦點(diǎn)view滑動(dòng)上來更胖,如果小于0铛铁,說明不存在遮擋,還原即可
                if (diff > 0) {
                    if (srcPaddingBottm != diff) {
                        contentView.setPadding(contentView.getPaddingLeft(), contentView.getPaddingTop(), contentView.getPaddingRight(), diff + srcPaddingBottm);
                        contentView.scrollBy(0, diff);
                    }
                } else {
                    if (contentView.getPaddingBottom() != 0) {
                        contentView.setPadding(contentView.getPaddingLeft(), contentView.getPaddingTop(), contentView.getPaddingRight(), srcPaddingBottm);
                    }
                }
            }

        }
    };

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末却妨,一起剝皮案震驚了整個(gè)濱河市饵逐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彪标,老刑警劉巖倍权,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捞烟,居然都是意外死亡薄声,警方通過查閱死者的電腦和手機(jī)当船,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來默辨,“玉大人德频,你說我怎么就攤上這事∷跣遥” “怎么了抱婉?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桌粉。 經(jīng)常有香客問我蒸绩,道長,這世上最難降的妖魔是什么铃肯? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任患亿,我火速辦了婚禮,結(jié)果婚禮上押逼,老公的妹妹穿的比我還像新娘步藕。我一直安慰自己,他們只是感情好挑格,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布咙冗。 她就那樣靜靜地躺著,像睡著了一般漂彤。 火紅的嫁衣襯著肌膚如雪雾消。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天挫望,我揣著相機(jī)與錄音立润,去河邊找鬼。 笑死媳板,一個(gè)胖子當(dāng)著我的面吹牛桑腮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛉幸,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼破讨,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了奕纫?” 一聲冷哼從身側(cè)響起提陶,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎若锁,沒想到半個(gè)月后搁骑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斧吐,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡又固,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年仲器,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仰冠。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乏冀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洋只,到底是詐尸還是另有隱情辆沦,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布识虚,位于F島的核電站肢扯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏担锤。R本人自食惡果不足惜蔚晨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肛循。 院中可真熱鬧铭腕,春花似錦、人聲如沸多糠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夹孔。三九已至被盈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搭伤,已是汗流浹背害捕。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闷畸,地道東北人尝盼。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像佑菩,于是被迫代替她去往敵國和親盾沫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354