当前位置: 首页 > 知识库问答 >
问题:

ViewPager片段saveInstanceState

於彬
2023-03-14

我有一个包含ViewPager的简单活动,它显示片段。

我的活动应该显示关于足球联赛的信息,每个片段显示像直播/比赛日、表格等信息。

我启动活动的意图包含联赛 ID。

每个片段都需要这个联盟id来加载正确的数据。

所以我的FragmentPagerAdapter看起来像这样

public class LeaguePagerAdapter extends FragmentPagerAdapter {

    private String leagueId;

    public LeaguePagerAdapter(FragmentManager fm, String leagueId) {
        super(fm);
        this.leagueId = leagueId;
    }

    @Override
    public Fragment getItem(int pos) {
        if (pos == 0){
            return TableFragment.newInstance(leagueId);
        } else {         
            return MatchdayFragment.newInstance(leagueId);
        }
    }
}

表格片段看起来像这样(比赛日片段看起来相似):

public class TableFragment extends PullToRefreshListViewAdFragment {

    private String leagueId;

    public static TableFragment newInstance(String leagueId) {
        TableFragment t = new TableFragment();
        t.leagueId = leagueId;
        return t;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
              // Setup UI and load data
        }
}

有时 leagueId 为空。我在崩溃日志中看到异常(小动物主义)。但我问自己为什么。在我看来,问题是当活动在后台被破坏并重建时,如果(例如)用户使用多任务按钮切换到我的应用程序

因此,据我所知,如果活动已被删除,原始意图将由Android本身存储在内部。因此,我没有在我的活动和片段中实现任何onSaveInstanceState()。在我的活动中,我阅读了Intent Extra以检索leagueId。这在恢复活动时也可以正常工作。我假设通过重新创建活动,将创建一个新的 LeaguePagerAdapter,并且所有片段也将是新创建的。

这是对的吗?或者“旧”片段实例是否会恢复,因此 leagueId 为空(因为片段尚未将 leagueId 存储在 Fragments onSaveInstanceState 方法中?

有没有办法测试这种生命周期的东西?

共有1个答案

高高雅
2023-03-14

它为空的原因是系统使用默认构造函数还原Fragment。以下是文件内容:

每个片段必须有一个空的构造函数,这样在恢复其活动状态时就可以实例化它。强烈建议子类不要有其他带参数的构造函数,因为这些构造函数在片段被重新实例化时不会被调用;相反,参数可以由调用者用setArguments(Bundle)提供,稍后由片段用getArguments()检索。

edit:还有,看看这个:Fragment的onSaveInstanceState()从未被调用

edit:为了进一步添加,您正在使用newInstance(String)方法创建Fragment。如果Fragment被Android杀死,它将使用默认构造函数,因此不会设置leagueId变量。尝试使用setArguments/getArguments将值传递到Fragment中。

 类似资料:
  • 下面是: 这是我要用于向中添加项的方法

  • 我想在一个Android应用程序中使用3个片段,ired:creating-and-using-fragmentpageradapter。但是我想使用viewpager来滑动和显示片段,就像在:ViewPager-with-FragmentPagerAdapter中解释的那样。但是这个代码或者Android Studio示例的默认代码,每次需要时使用newInstance创建实例,不需要时销毁。

  • 我的应用程序有两个项目的导航抽屉:一个ViewPager(在一个片段内)和支持Map碎片。 ViewPager使用FragmentStatePagerAdapter并返回两个片段。 当我打开抽屉菜单并选择“项目1”(支持MapFrature)时,另一个碎片(ViewPager在其中)执行,但此方法不会破坏适配器创建的碎片,所以当我再次选择“项目0”时,我的应用程序创建的ViewPager与它的两个

  • 我对片段有问题,或者更确切地说是我希望它们工作的方式有问题。 在我的活动中,我有一个布局容器(R.id.container1),我在启动时以编程方式向其中添加一个片段(FragMain)。在片段中,我有2个片段(Frag1、Frag2)和一个ViewPager,它通过FragmentPagerAdapter加载其他几个片段(FragA、FragB、FragC、FragD、FragE)。 按下一个按

  • 我在一个详细视图中使用ViewPager和FragmentPagerAdapter。这意味着我有一个项目列表,一个屏幕显示单个项目的细节。但用户可以左右滑动来浏览所有项目。这遵循了谷歌滑动视图的指导方针。 但是我想知道一件事。在ListView中,每一行的视图都会被重用。一旦一行从屏幕上滚动出来,它就会被重用为绑定到ListView的适配器的getView方法的转换器视图参数。但是这种重用行为似乎

  • 在使用带有片段的时,在选项卡之间移动时不会调用我们的和方法。我们有什么办法可以从碎片中找出我们是被发现还是被隐藏? 不幸的是,我在、中有逻辑,就像在location services注册一样,在切换选项卡时永远不会停止,因为在退出整个应用程序之前,永远不会调用。

  • 有没有什么好的方法来引用用创建的片段?或者我应该如何从我的活动(准确地说是从选项菜单)中刷新查看页中的片段?

  • 当我向上选择选项卡时,它起作用,但当我返回时,内容变成白色。LogCat显示: 致命异常:main java.lang.IllegalArgumentException:在Android.support.v4.app.FragmentManagerImpl.MoveToState(FragmentManager.java:903)在Android.support.v4.app.FragmentMa