как удалить фрагмент пейджера из активности, чтобы предотвратить восстановление старого экземпляра фрагмента с помощью os - PullRequest
0 голосов
/ 06 сентября 2018

Это действие, содержащее фрагмент пейджера, который имеет android.support.v4.view.ViewPager и класс адаптера, полученный из FragmentStatePagerAdapter.

Проблема связана с фрагментом пейджера, в котором кэшированы два или три фрагмента, но данные не могут быть проанализированы (включая представление, динамически получающее данные из 3-й части SDK), когда когда-нибудь создается этот фрагмент в случае, если свернуть / открыть его снова или после поворота восстановленный фрагмент остается пустым (используется тот из кеша и не хватает данных).

Не найти способ повторно заполнить фрагменты, восстановленные ОС, через поток восстановления фрагмента пейджера.

Даже пытался во фрагменте пейджера очистить данные адаптера в 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 получил эту позицию, так что это ос воссоздал один из кеша. Но как это могло быть после того, как при beging уже установил адаптер с пустым списком в 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().

И когда os восстанавливает активность, ContentPagerFragment отображается в onAttachFragment(fragment: Fragment) действия до вызова действия onCreate(savedInstanceState: Bundle?).

Почему viewPager использует старый фрагмент после удаления фрагмента пейджера из supportFragmentManager действия?

Как запретить пейджеру представления использовать кэшированный фрагмент?

...