如何从活动中删除寻呼机片段以防止os

时间:2018-09-06 17:51:09

标签: kotlin android-viewpager fragmentstatepageradapter

这是一个托管具有android.support.v4.view.ViewPager和源自FragmentStatePagerAdapter的适配器类的寻呼机片段的活动。

问题是来自寻呼机片段,它缓存了两个或三个片段,但是数据不可解析(包括从第3部分sdk动态获取的视图),有时在某些情况下os重新创建该片段,例如最小化/重新打开它,或旋转后,还原的片段为空白(使用缓存中的片段且缺少数据)。

找不到通过寻呼机片段的重新创建流程重新填充由os恢复的片段的方法。

甚至在分页器片段中尝试过在onActivityCreated()中清除适配器的数据

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val childFragmentManager = childFragmentManager
        mAdapter = ContentPagerAdapter( activity as Context, 
                         childFragmentManager, emptyList()) 
        mContentViewPager!!.setAdapter(mAdapter)
        mAdapter?.setData(emptyList())
    }

适配器:

fun setData(itemsList: List<Data>) {
    this.data = itemsList
    notifyDataSetChanged()
}

重新创建流程完成后,viewPager似乎仍显示先前的片段,没有预期的数据。 (试图确保它来自缓存的那个,通过在片段的onsaveInstance()中将数据的位置保存在适配器数据列表中,然后在viewPager中重新创建的片段获得了该位置,因此是操作系统从缓存中重新创建了一个操作系统。但是在开始之后怎么可能已经将适配器设置为onActivityCreated()的空列表。

无法通过将数据设置为空来清理碎片。

因此,我们尝试从onDestroy()的活动中删除页面片段,希望不会将任何片段放入缓存:

class ContentPagerFragment :Fragment {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val view = inflater.inflate(R.layout.content_pager, container, false)
        mContentViewPager = view.findViewById(R.id.contentViewPager)

        return view
     }


    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val childFragmentManager = childFragmentManager
        mAdapter = ContentPagerAdapter( activity as Context, 
                         childFragmentManager, emptyList()) 
        mContentViewPager!!.setAdapter(mAdapter)
        mAdapter?.setData(emptyList())
    }

    interface RemoveFragmentAtClose {
        fun onContentPagerFragmentDoestroy()
    }

    override fun onDestroy() {
        (activity as? RemoveAtCloseFragment)?
            .onContentPagerFragmentDoestroy()
        super.onDestroy()
    }

}

以及托管活动中

class HostActivity : AppCompatActivity(), 
                     ContentPagerFragment.RemoveFragmentAtClose {

    override fun onContentPagerFragmentDoestroy() {
                 supportFragmentManager.beginTransaction().
        remove(supportFragmentManager.findFragmentById(R.id.pagerFragmentContainer))
            .commitAllowingStateLoss()

        var contentPagerFragment = ContentPagerFragment::class.java.cast(supportFragmentManager
            .findFragmentById(R.id.pagerFragmentContainer))

        Log.i(TAG, " onContentPagerFragmentDoestroy(), this $this" +
            "\ngetContentPagerFragment: $contentPagerFragment"
        )
    }

    override fun onAttachFragment(fragment: Fragment) {
        Log.d(TAG, " onAttachFragment(), " +
            "fragment: $fragment \nthis $this")
    }

}

但是日志显示supportFragmentManager.findFragmentById(R.id.pagerFragmentContainer)在调用.commitAllowingStateLoss()之后仍然找到了片段。

当操作系统恢复活动时,在调用活动onAttachFragment(fragment: Fragment)之前,ContentPagerFragment将显示在活动onCreate(savedInstanceState: Bundle?)中。

从活动的supportFragmentManager中删除分页器片段后,为什么viewPager使用旧的片段?

如何防止视图分页器使用缓存的片段?

0 个答案:

没有答案