【持续更新】Android疑难杂症解决小记

1.简介

在Android开发中,总会遇到许许多多的疑难杂症,各种google、baidu、StackOverFlow 上找答案,毕竟很多水答案混淆视听,本小记当中都是开发中遇到的坑和亲身实践的解决方案,如果有错误或者有更好解决方案能交流下~文中可能有使用到别人的方法,如果有侵权请指明原文和出处,如果可以借鉴的话我这里注明出处,如果不可以借鉴的话我这里可以删掉。望谅解。

2.正文

2.1 ScrollView使用后adjustPan不起作用,键盘会将ScrollView下部布局顶起

这个应该是由于布局计算方式导致,在清单文件中加了adjustPan也没用,还是会将底部的按钮一类的布局顶起来,覆盖了部分布局,巨丑无比。解决方案:
方法1.在onCreate的setContentView之后加一句
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

即可。
方法2.也可以根据键盘弹出状态来做下方控件的显隐,虽然很low,但也是一种解决方案:
v_root.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值

                //现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起
                if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) {// 弹起
                    ViewGroup.LayoutParams lp = v_bottom.getLayoutParams();
                    lp.height=0;
                    v_bottom.setLayoutParams(lp);
                } else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) {// 关闭
                    ViewGroup.LayoutParams lp = v_bottom.getLayoutParams();
                    lp.height= DensityUtil.dip2px(mContext, 52);
                    v_bottom.setLayoutParams(lp);
                    v_root.clearFocus();
                }
            }
        });

其中v_root是当前布局文件的根布局,v_bottom是底部需要被键盘盖住的控件,keyHeight是获取当前屏幕高度的三分之一。

2.2 由于有EditText存在,就算是取消了键盘弹出,页面一进入时第一个EditText中会有光标闪烁

由于EditText是可以获得焦点的,即使限制了不弹出键盘,但光标还是随着焦点过来,一开始解决思路是将EditText焦点移除,但这样做的弊端是需要把所有的EditText的焦点都移除,并且还要保证当EditText点击时是可以获取到焦点并弹出键盘的。其实可以换一个思路,在一个页面之中,焦点只有一个,让其他控件在EditText之前先把焦点抢到即可,例如标题栏的TextView,抢到焦点之后并不会有什么影响。另外,一定要注意当EditText第一次获取到焦点之后要释放掉在它之前抢焦点控件,不然会闪屏过去。
        if (etEditable && view!=null && mEditText!=null) {
            view.setFocusable(true);
            view.setFocusableInTouchMode(true);
            view.requestFocus();
            view.requestFocusFromTouch();
            mEditText.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(view!=null) {
                        view.setFocusable(false);
                        view.setFocusableInTouchMode(false);
                        view.clearFocus();
                    }
                    mEditText.setOnClickListener(null);
                }
            });
            // 处理onClick事件共存
            mEditText.setOnTouchListener(new OnTouchListener() {
                int touchFlag = 0;

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (hasOnClickListeners()) {
                        touchFlag++;
                        if (touchFlag == 2) {
                            mEditText.callOnClick();
                        }
                    }
                    return false;
                }
            });
        }


 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值