监听软键盘 刷新布局视图

本文介绍了如何在Android中监听软键盘的显示与隐藏,通过在manifest中设置`android:windowSoftInputMode="stateHidden|adjustResize"`来控制软键盘行为,并通过监听根布局的OnLayoutChangeListener来判断软键盘的弹出和收起,从而动态调整布局视图。
摘要由CSDN通过智能技术生成

第一步:

需要在manifest的相应activity中设置android:windowSoftInputMode=”stateHidden|adjustResize”
里面的值很迷糊,备注一下:
【1】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

【2】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

【3】stateHidden:用户选择activity时,软键盘总是被隐藏

【4】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

【5】stateVisible:软键盘通常是可见的

【6】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

【7】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

【8】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

【9】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

第二步:

监听软键盘的弹出和收起,以便更新布局视图。原理是,当软键盘弹出或收起时,根布局的bottom坐标会发生变化,所有给根布局添加addOnLayoutChangeListener监听,当变化超过1/3屏幕高度时,我们视为然键盘发生了弹出或收起。
Activity里的代码,已经加了注释,应该能看懂:


public class LoginActivity extends BaseActivity implements View.OnLayoutChangeListener {
    private FrameLayout rootView;
    private int keyHeight;
    private int ivHeight;
    private ImageView iv;
    @Override
    protected int getLayoutId() {
        return R.layout.act_login;

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        rootView = (FrameLayout) findViewById(R.id.root);
        iv = (ImageView) findViewById(R.id.imageView);
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        keyHeight = dm.heightPixels / 3;
        rootView.addOnLayoutChangeListener(this);
        //添加监听获取宽高
        final ViewTreeObserver vto = iv.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ivHeight = iv.getMeasuredHeight();
//                避免重复添加监听
               iv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });

    }

    LinearLayout.LayoutParams lp;

    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        LogUtil.e("left=" + left + "----top=" + top + "----right=" + right + "----bottom=" + bottom);
        LogUtil.e("oldLeft=" + oldLeft + "----oldTop=" + oldTop + "----oldRight=" + oldRight + "----oldBottom=" + oldBottom);
        if (oldBottom != 0 && bottom != oldBottom) {//排除activity刚进来时的变化,以及没有变化时的情况
            //当oldBottom和bottom的变化范围超过1/3屏幕时,我们视为键盘发生的弹出或收起。
            if (oldBottom - bottom > keyHeight) {//弹出
                ;
                hideAnim();

            } else if (bottom - oldBottom > keyHeight) {//收起

                showAnim();
            }
        }
    }

    private void hideAnim() {
        ValueAnimator anim = ValueAnimator.ofInt(ivHeight, 0);
        anim.setDuration(500);
        anim.setInterpolator(new DecelerateInterpolator());
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int value = (int) animation.getAnimatedValue();
                if(ivHeight%2==0){
                    lp = (LinearLayout.LayoutParams) iv.getLayoutParams();
                    lp.height = value;
                    iv.setLayoutParams(lp);
                }
            }
        });
        anim.start();
    }

    private void showAnim() {
        ValueAnimator anim = ValueAnimator.ofInt(0, ivHeight);
        anim.setDuration(500);
        anim.setInterpolator(new AccelerateInterpolator());
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int value = (int) animation.getAnimatedValue();
                if(value==ivHeight||ivHeight%2==0){
                    lp = (LinearLayout.LayoutParams) iv.getLayoutParams();
                    lp.height = value;
                    iv.setLayoutParams(lp);
                }

            }
        });
        anim.start();
    }
}

完结。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值