android viewpager2和scrollerview嵌套百度地图MapView导致滑动有黑边或者阴影问题

先说viewpager2吧,这个是一个新的控件,很好用,特别是用kotlin之后。
但在做垂直滑动的时候里面嵌套一个edittext出现了大问题,但我相信如果你对自定义很熟悉的话最后还是不用再viewapger里面嵌套editext,因为edittext每次都弹出软键盘和每输入一个字的时候view pager2 会重绘,会重新执行一些方法,然而一个方法会每次都会清除所有的焦点并且会赋值第一item的焦点,大家都知道viewpager2内部核心是recyclerview实现 的。

 // Add currentItemUpdater before mExternalPageChangeCallbacks, because we need to update
        // internal state first
        mPageChangeEventDispatcher.addOnPageChangeCallback(currentItemUpdater);
        mPageChangeEventDispatcher.addOnPageChangeCallback(focusClearer);

看到上面的一个回调中focusClearer,继续

// Prevents focus from remaining on a no-longer visible page
        final OnPageChangeCallback focusClearer = new OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                clearFocus();
                if (hasFocus()) { // if clear focus did not succeed
                    mRecyclerView.requestFocus(View.FOCUS_FORWARD);
                }
            }
        };

clearFocus ()最终会走到这个方法,这里是Android sdk30

/**
     * Clears focus from the view, optionally propagating the change up through
     * the parent hierarchy and requesting that the root view place new focus.
     *
     * @param propagate whether to propagate the change up through the parent
     *            hierarchy
     * @param refocus when propagate is true, specifies whether to request the
     *            root view place new focus
     */
    void clearFocusInternal(View focused, boolean propagate, boolean refocus) {
        if ((mPrivateFlags & PFLAG_FOCUSED) != 0) {
            mPrivateFlags &= ~PFLAG_FOCUSED;
            clearParentsWantFocus();

            if (propagate && mParent != null) {
                mParent.clearChildFocus(this);
            }

            onFocusChanged(false, 0, null);
            refreshDrawableState();

            if (propagate && (!refocus || !rootViewRequestFocus())) {
                notifyGlobalFocusCleared(this);
            }
        }
    }

本人对源码都是很不了解大概是会清除父类下面的子类并刷新。

所以说如果改变了当前页面,如果有焦点会一并清除,而edittext需要随时获取焦点,所以造成了获取焦点出现问题

解决方法:
/**
* Use with {@link #focusSearch(int)}. Move focus to the next selectable
* item.
* /**
*与{@link#focusSearch(int)}一起使用。将焦点移到下一个可选择的位置
*项目。
*/
*/
public static final int FOCUS_FORWARD = 0x00000002;

因为之后会设置这个值,上面是百度翻译过了,说的是会把焦点自动移动到下一个可选择的位置,只需要再再添加一个edittext设置宽度为0就好。

scrollerview嵌套百度地图MapView导致滑动有黑边或者阴影问题
这个是刚刚开始些的时候发现的,老版本是不建议再scrollview里面嵌套地图的,而新的版本解决办法是用另一个map com.baidu.mapapi.map.TextureMapView就可以解决问题,也测试过,完美解决

Scrollview嵌套百度地图MapView导致滑动有黑边或者阴影问题

解决ScrollView嵌套百度地图滑动冲突

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值