android viewpager2和scrollerview巢狀百度地圖MapView導致滑動有黑邊或者陰影問題

onesidego發表於2020-12-19

先說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巢狀百度地圖滑動衝突

相關文章