Android问题汇总(遥远的回忆过去)安卓杂烩

Android-RecyclerView翻页案例-某些机型输入法

2019-11-14  本文已影响0人  MonkeyLei

之前的实现 MonkeyLei:Android-RecyclerView实现多页面答题流程,翻页/提交实现+RV加背景无法下一步问题, 最近移植到重构版工程中,发现有个华为的机型,如果输入法存在的情况下,点击下一页,瞬间到了下一页,但是又刷新了,还是当前页面,感觉就像下一页翻过去了,但是销毁了???

就是如下这种感觉,同样的代码,在旧的环境下没问题,到新版的环境就炸了???想不通呀。。。

https://zhuanlan.zhihu.com/p/91786236

我各种都尝试了,包括不让置顶,嵌套/不嵌套scrollview,然后取消rv的一些乱七八糟的设置,以及多余的代码,精简到重新建了一个工程,单纯的做翻页,还是不行。。。就那个机型不行。。。。。

最终方案:

1. 暂时采用等待键盘隐藏后跳转到下一页** - 先用这个吧,喵,也就是监听输入法键盘隐藏回调事件.(根据网上方案综合做了完善,目前给测试测了,没啥大问题)**

2. 采用Viewpaper替换rv实现翻页选项 - 这个方案准备下一个版本迭代的时候搞

逻辑修改大概如下:

                // 某些机型键盘会导致无法下一步,这里等键盘回收再调用
                if (SoftKeyBoardUtil.isSoftShowing(this)) {
                    // 先把键盘藏起来
                    SoftKeyBoardUtil.hideKeyBord(this);
                    //                    new Handler().postDelayed(new Runnable() {
                    //                        @Override
                    //                        public void run() {
                    //                            mathchRv.scrollToPosition(++curPos);

                    //                        }
                    //                    }, 500);
                    // 不采用延迟了,采用监听键盘回收事件
                    SoftKeyBoardListener.setListener(this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {

                        @Override
                        public void keyBoardShow(int height) {

                        }

                        @Override
                        public void keyBoardHide(int height) {
                            mathchRv.scrollToPosition(++curPos);
                        }
                    });
                } else {
                    mathchRv.scrollToPosition(++curPos);
                }
                break;

相关的调用类:

**SoftKeyBoardUtil.java **- 其他额外的方法就不贴了

 /**
 * Created by hl on 2018/3/26.
 */

public class SoftKeyBoardUtil {
    /**
     * 获取软键盘是否可见
     * @param context
     * @return
     */
    public static boolean isSoftShowing(Activity context) {
        //获取当屏幕内容的高度
        int screenHeight = context.getWindow().getDecorView().getHeight();
        //获取View可见区域的bottom
        Rect rect = new Rect();
        //DecorView即为activity的顶级view
        context.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
        //考虑到虚拟导航栏的情况(虚拟导航栏情况下:screenHeight = rect.bottom + 虚拟导航栏高度)
        //选取screenHeight*2/3进行判断
        return screenHeight * 2 / 3 > rect.bottom;
    }
}

SoftKeyBoardListener.java -- 其实主要就是监听布局的变化(如果键盘收起来,之前被顶起来的布局会还原,进而会导致布局状态发生变化)

import android.app.Activity;
import android.view.View;
import android.view.ViewTreeObserver;

public class SoftKeyBoardListener {
    private View rootView;//activity的根视图
    private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;

    public SoftKeyBoardListener(Activity activity) {
        //获取activity的根视图
        rootView = activity.getWindow().getDecorView();

        //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                // https://blog.csdn.net/auccy/article/details/80664234 - 这个方法有问题,采用下面的方式
                if (SoftKeyBoardUtil.isSoftShowing(activity)) {
                    if (onSoftKeyBoardChangeListener != null) {
                        onSoftKeyBoardChangeListener.keyBoardShow(-1);
                    }
                } else {
                    if (onSoftKeyBoardChangeListener != null) {
                        onSoftKeyBoardChangeListener.keyBoardHide(-1);
                    }
                }
                onSoftKeyBoardChangeListener = null;
            }
        });
    }

    private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
        this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
    }

    public interface OnSoftKeyBoardChangeListener {
        void keyBoardShow(int height);

        void keyBoardHide(int height);
    }

    public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
        SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
        softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
    }
}

目前改了,就暂时ok了。。也不会影响什么体验!!!所以先记录下。下一个版本,直接用viewpaper做吧。。。另外我去看哈驾考宝典的答题,去学习下看看....顺便琢磨是否有更好用的控件....

上一篇下一篇

猜你喜欢

热点阅读