这是一个托管具有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使用旧的片段?
如何防止视图分页器使用缓存的片段?