luckybilly/Gloading

如果 wrap 的参数是 viewpager 的子 view,出现一片空白

teletian opened this issue · 6 comments

如果 wrap 的参数是 viewpager 的子 view,出现一片空白

在ViewPager的Adapter中,用holder.getWrapper()代替被wrap的view

在ViewPager的Adapter中,用holder.getWrapper()代替被wrap的view

用的是 FragmentPagerAdapter,直接返回的 Fragment,然后 wrap 的对象是 Fragment 的顶层布局。

改成返回 wapper 之后,发现返回 Wrapper 的时候 Fragment 还没初始化,导致空指针异常。这个怎么破?

话说如果要修改 adapter 返回的 view,是不是又存在那么一点点耦合性?不知道有没有办法避免

用的是 FragmentPagerAdapter,直接返回的 Fragment,然后 wrap 的对象是 Fragment 的顶层布局。

改成返回 wapper 之后,发现返回 Wrapper 的时候 Fragment 还没初始化,导致空指针异常。这个怎么破?

不确定你说的顶层布局指的具体是什么,要不你把wrap这一块的代码贴一下吧

再说明一下:
Gloading的工作原理是将目标View用一个FrameLayout包裹起来,LoadingView可以在这个FrameLayout中覆盖显示在目标View之上,从而达到各种状态显示的效果。

Gloading的工作原理

这个之前也看过源码,就是把原来的 View 给剔除,然后加一个 FrameLayout,然后在吧 LoadingView 和原来的 View 一起加到 Fragment 里面去。
但是就是搞不懂为什么 warp 的对象是 ViewPager 的直接子 View 就显示空白

不确定你说的顶层布局指的具体是什么,要不你把wrap这一块的代码贴一下吧

首先我有一个 ViewPager,包含两个 Fragment,代码如下

viewPager.adapter =
        PagerAdapter(supportFragmentManager ,listOf(fragment1, fragment2))

class PagerAdapter
    constructor(fm: FragmentManager, private val mFragments: List<Fragment>) : FragmentPagerAdapter(fm) {

        override fun getItem(i: Int): Fragment {
            return mFragments[i]
        }

        override fun getCount(): Int {
            return mFragments.size
        }
    }

然后我的 Fragment1 的布局是这样的

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="viewModel"
            type="com.xxx.ui.viewmodel.ViewModel" />
    </data>

    <LinearLayout
        android:id="@+id/main_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tab_layout"
            style="@style/Widget.MaterialComponents.TabLayout"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="@android:color/white"
            android:elevation="4dp"
            app:tabIndicatorColor="@color/colorAccent"
            app:tabSelectedTextColor="@color/colorAccent" />

        <androidx.viewpager.widget.ViewPager
            android:id="@+id/view_pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

    </LinearLayout>
</layout>

然后我再 Fragment1 中是这样 wrap 的

Gloading.getDefault().wrap(main_layout).withRetry(retryTask).showLoading()

wrap 的对象是 Fragment 的布局文件的最顶层的 main_layout。
如果我换成不是顶层的布局,比如说 main_layout 的子 View,就没有问题了。
如果我还是用顶层的 main_layout,但是 Fragment 1 直接加入到某个 FrameLayout 中而不是加入到 ViewPager 中,就没有问题了。

所以问题还是出现在,wrap 的对象是 ViewPager 的直接子 View。

用 Android Studio 的 Layout Inspector 看了下,显示空白的时候,ViewPager 下面有两个子View,对应我的两个 Fragment,但是发现我们重新组合好的那个 FrameLayout 的 width 和 height 是 0!

但是为啥是 0 一直没搞清。。。

Fragment.onCreateView方法中返回的是holder.getWrapper()吗?

Fragment.onCreateView方法中返回的是holder.getWrapper()吗?

改成这样可以了。看来 FrameLayout 只有返回给 Adapter 才正常,不然 FrameLayout 的大小为 0