在 saveOnIstanceState() 之后 viewPager.setCurrentItem() 似乎不起作用

Posted

技术标签:

【中文标题】在 saveOnIstanceState() 之后 viewPager.setCurrentItem() 似乎不起作用【英文标题】:viewPager.setCurrentItem() seems not working after saveOnIstanceState() 【发布时间】:2019-10-28 23:58:49 【问题描述】:

我有一个实现 ViewPager 的片段,在这个片段中,我使用 onSaveInstanceState() 方法保存 ViewPager 状态。我可以使用 viewPager.getCurrentItem() 将它保存在包中,但是当我去恢复 ViewPager 的状态时,viewPager.setCurrentItem() 似乎不起作用。 如何正确保存片段状态?

这是我的片段代码

public class HomeFragment extends Fragment 
private ViewPager viewPager;
private ViewPagerAdapter adapter;
Integer[] colors=null;
List<Model> models;
private String[] mDescriptions;
private String[] mTitle;
private String mPlayerName;


@Override
public void onSaveInstanceState(@NonNull Bundle outState) 
    super.onSaveInstanceState(outState);
    outState.putInt("currentItem", viewPager.getCurrentItem());





@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 

    models = new ArrayList<>();
    Resources res = getResources();
    mDescriptions = res.getStringArray(R.array.newGameDescription);
    mTitle = res.getStringArray(R.array.newGame);
    models.add(new Model(R.drawable.ic_launcher_background,mTitle[0], mDescriptions[0]));
    models.add(new Model(R.drawable.ic_launcher_background,mTitle[1], mDescriptions[1]));
    models.add(new Model(R.drawable.ic_launcher_background,mTitle[2], mDescriptions[2]));
    models.add(new Model(R.drawable.ic_launcher_background,mTitle[3], mDescriptions[3]));

    adapter = new ViewPagerAdapter(getContext(), models, mPlayerName);
    int orientation = getResources().getConfiguration().orientation;
    adapter.setOrientation(orientation);

    View view = inflater.inflate(R.layout.fragment_home, container, false);

    viewPager = (ViewPager) view.findViewById(R.id.gameModeViewPager);
    viewPager.setAdapter(adapter);
    viewPager.setPadding(130,0,130,0);

    return view;



@Override
public void onActivityCreated(final Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) 
        // Restore last state for checked position.
        viewPager.postDelayed(new Runnable() 

            @Override
            public void run() 
                int item = savedInstanceState.getInt("currentItem");
                viewPager.setCurrentItem(item);
            
        , 100);
    

欢迎任何建议和评论,在此先感谢

【问题讨论】:

您是否尝试过将代码中已保存的实例状态部分移至 onViewCreated()? 尝试调用"outState.putInt("currentItem", viewPager.getCurrentItem());"在 super.onSaveInstanceState(...); 之前 @deive 看看我对答案的评论 @W0rmH0le 移动超级方法似乎不起作用 如何添加片段?它有 ID 或标签吗?见***.com/questions/20550016/… 【参考方案1】:

onCreateView 不会从 onSaveInstanceState 返回捆绑值,您必须从 onActivityCreated 获取它

     @public void onActivityCreated(Bundle savedInstanceState) 
                  super.onActivityCreated(savedInstanceState);
                      if (savedInstanceState != null) 
                // Restore last state for checked position.
    viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
            
                @Override
                public void onGlobalLayout()
                
                   int item = savedInstanceState.getInt("currentItem");
                   viewPager.setCurrentItem(item);    
        
     ); 
   

【讨论】:

在这种情况下它似乎也不起作用,在 onActivityCreated () 中打印 item 会正确打印保存在包中的页面数,但是 viewPager.setCurrentItem (item);设置页码 0。 再次遗憾的是,加载的页面始终为 0 :( 请用编辑后的代码更新您的问题,以便我们了解问题 再次,它似乎不起作用。在这一点上,我想知道如何正确地测试这个东西。我只是更改页面并切换到 0 以外的页面,现在我旋转手机(使用主动旋转)以便重新加载布局,此时我应该在 viewPager 中看到我保存在包中的页面但是不是。 让我们continue this discussion in chat。

以上是关于在 saveOnIstanceState() 之后 viewPager.setCurrentItem() 似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

javascript ::在JS之后的元素之后或::之前

使用 TLS,传输层是不是出现在 DNS 之后,并且在数据准备好添加 TCP 标头之后再次出现?

在每个类声明之后每个函数定义结束之后都要加空行。

如何在c#中的xml之后添加数据并在之后读取xml?

Android ListView 在 saveButton 之后没有更新,而是在 onItemSelected 之后更新

angularjs如何在视图渲染结束之后,或者render之后执行指令中的link方法呢?