首页 > 其他分享 >ViewPager2+Fragment+FragmentStateAdapter遇到系统主题更换时Fragment数据丢失

ViewPager2+Fragment+FragmentStateAdapter遇到系统主题更换时Fragment数据丢失

时间:2023-04-20 17:00:48浏览次数:46  
标签:mStep Fragment fun override FragmentStateAdapter position ViewPager2 mFragments

1. 问题描述:

  在ViewPager 设置壁纸,导致Activity 获取Fragment 数据丢失 

2. 解决方案:  

  设置 vp.isSaveEnabled = false   ,设置不保存,在适配器中销毁item 

  引发问题:vp 重建之后,会丢失之前所在的位置

  解决方案:Activity onSaveInstanceState 中保存数据,在 onRestoreInstanceState  中恢复状态

3. 代码实现:

在Activity :    
    vp.isSaveEnabled = false


    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        mStep = savedInstanceState?.getInt("mStep", mStep)
        if (mStep == STEP2) {
            step(STEP2)
        } else if (mStep == STEP3) {
            step(STEP3)
        }
        LogUtils.i("onRestoreInstanceState mStep=$mStep")
    }

    override fun onSaveInstanceState(outState: Bundle) {
        outState.putInt("mStep", mStep)
        super.onSaveInstanceState(outState)
    }

适配器:
/**
 * 通用Fragment 适配器
 */
class SimpleFragmentStateAdapter(activity: FragmentManager, val fragments: List<Fragment>) :
    FragmentStatePagerAdapter(activity) {

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

    override fun getItem(position: Int): Fragment {
        return fragments[position]
    }

    override fun instantiateItem(container: ViewGroup, position: Int): Any {
        val mFragments = javaClass.superclass?.getDeclaredField("mFragments")
        mFragments?.isAccessible = true
        (mFragments?.get(this) as ArrayList<*>?)?.clear()

        val mSavedState = javaClass.superclass?.getDeclaredField("mSavedState")
        mSavedState?.isAccessible = true
        (mSavedState?.get(this) as ArrayList<*>?)?.clear()
        return super.instantiateItem(container, position)
    }

}

  

参考致谢:

Android ViewPager2+Fragment+FragmentStateAdapter遇到系统主题更换时Fragment数据丢失

Android ViewPager+Fragment遇到系统主题更换时Fragment不正常刷新

 

标签:mStep,Fragment,fun,override,FragmentStateAdapter,position,ViewPager2,mFragments
From: https://www.cnblogs.com/lizhilin2016/p/17337433.html

相关文章

  • Fragment——底部导航栏的实现
    本节开始我们会讲解一些Fragment在实际开发中的一些实例!而本节给大家讲解的是底部导航栏的实现!而基本的底部导航栏方法有很多种,比如全用TextView做,或者用RadioButton,又或者使用TabLayout+RadioButton,当然复杂的情况还是得走外层套布局的方法!本节我们用TextView来做一个底部导航栏......
  • Activity向fragment传入数值
    因项目需要activity向fragment传值,搜索了很久,看了一些书,实现了代码:我传入的是一个int类型值activity(menu)staticintUser_id;//没有static会置0,具体原因不清楚publicintgetUser_id(){returnUser_id;}publicvoidsetUser_id(intuser_id){User_id......
  • Android studio 中fragment 的简单应用
    在AndroidStudio中,Fragment是一种可重用的UI组件,它代表了Activity中的一部分界面。它类似于Activity,但是可以被添加、删除和替换,同时可以与其他Fragment组合在一起形成更复杂的UI界面。通常情况下,Activity由多个Fragment组成,每个Fragment都有自己的布局和功能,可......
  • fragment里导入listview
    Fragment中使用listview的用法文章目录Fragment中使用listview的用法1、定义xml1.1fragment_my.xml1.2my_menu.xml1.3Fragment核心代码1.4测试背景:在android项目中,经常用到关于listview的,经过很多博客博主的文章,我尝试很多测试都失败了,终于通过不断的总结调试终于有了可靠的......
  • viewPager2页面的切换
    使用流程:  1.定义ViewPager  2.为ViewPager创建AdapterViewPagerAdapterpackagecom.example.viewpagerandfragment;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.RelativeLayout;importand......
  • Activity发送信息给Fragment
    在MainActivity中设置发送的信息,在fragment中接收,@OverridepublicvoidonClick(Viewview){switch(view.getId()){caseR.id.btn:Bundlebundle=newBundle();bundle.putString("message","我喜欢学习");Blan......
  • Fragment动态添加与管理
    activity_main.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools=&quo......
  • Pro Android学习笔记(四五):Dialog(2):DialogFragment
    DialogFragment的实例newInstance()已经在上一次学习笔记中实现。我们创建dialog的UI,可以通过重写DialogFragment的两个函数当中的一个来实现,这两个函数是onCreateView()和onCreateDialog(),前者返回view,后者返回dialog,如同通过AlertDialog.Builder构造一样。重写onCreateView()重写......
  • activity中传值给fragment
    /*//创建Fragment实例detailfragment=newdetail();//构建BundleBundlebundle=newBundle();//设置数据bundle.putString("account",this.account);//绑定Fragmentfragment.setArguments(bundle);FragmentManagerfragmentManager=getSupportFragmentManager();Fra......
  • 在android的fragment中使用子线程查询的数据如何实时更新在主界面的listview中
    主要是使用handler来对ui界面进行实时更新 public class YourFragment extends Fragment {    private ListView mListView;    private YourAdapter mAdapter = new YourAdapter(getContext(), new ArrayList<YourData>());//注意这一步的初始化如果闪......