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

带有FragmentPagerAdapter成员的Android Viewpager在旋转后变为null

宣望
2023-03-14

我有一个带标签的活动。为了创建选项卡,我使用了片段并使用以下适配器类:

class ViewPagerAdapter extends FragmentPagerAdapter
{
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }



    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

以下是我在活动中所做的。(剥离下来,为了清晰起见,去掉了无关的碎片)。

 private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    SummaryTabFragment frag1 = new SummaryTabFragment();
    frag1.setUser(user);

    adapter.addFragment(frag1, "Summary");


    viewPager.setAdapter(adapter);
}

一切都很好,除了屏幕旋转的时候。应用程序在onCreateView中有对象变量的片段中崩溃,结果发现该片段的每个成员都是null,所以我收到一个NullPointerException。这很奇怪,因为当屏幕旋转,从而重新创建活动时,我会再次创建新的片段,设置成员变量,将它们添加到适配器中,并像以前一样设置viewPager。

我读过关于片段生命周期的文章,但不明白为什么这不起作用,因为我只是在重新创建一切。

共有1个答案

任繁
2023-03-14

我认为问题出在Fragment中,它有一些成员变量(字符串等)。当您旋转时,框架将调用默认构造函数(没有参数),因此您将松散输入数据。
要保留它,您应该尝试实现onSaveInstanceState(这里是示例

  Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putString("key", value);  
         }

然后像这样保留

@Override
       public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            if(savedInstanceState!=null){
                 int id =savedInstanceState.getInt("key"); // get the value agains
            }
        ...
    }

注意:我建议您不要使用带有一些参数的片段构造函数。您应该使用Frament的默认构造函数,然后将额外数据按Bundle进行分段

  Fragment fragment = new Fragment();
   Bundle bundle = new Bundle();
   bundle.putInt(key, value);
   fragment.setArguments(bundle);

然后在片段中检索数据(例如在onCreate()中),使用:

   Bundle bundle = this.getArguments();
   int myInt = bundle.getInt(key, defaultValue);

希望这能帮上忙

 类似资料:
  • 旋转变换rotate() 同画圆弧一样,这里的rotate(deg)传入的参数是弧度,不是角度。同时需要注意的是,这个的旋转是以坐标系的原点(0,0)为圆心进行的顺时针旋转。所以,在使用rotate()之前,通常需要配合使用translate()平移坐标系,确定旋转的圆心。即,旋转变换通常搭配平移变换使用的。 最后一点需要注意的是,Canvas是基于状态的绘制,所以每次旋转都是接着上次旋转的基础上

  • 在屏幕旋转后,虽然我在super.onCreate(null);,中传递null,但我得到了object返回的nullPointerException异常。我知道在传递savedInstanceState=null的同时必须销毁并重新创建活动,这意味着活动应该在旋转后开始,因为它是第一次开始,为什么在旋转后会出现此异常? onCreate()代码段,其中名为historyText的对象 Logca

  • 旋转设备后,我们在Backback或fragmentSupportManager中的任何片段都会激活onSaveInstanceState。 但是,在第一次旋转之后,内部的所有内容都为null(所有变量),应用程序会因null指针异常而崩溃。 我想知道为什么如果片段实际上被销毁为零(所有值都为null),为什么片段仍然存在,并且调用onSaveInstanceState? 我的代码很深,有多个基类

  • 我试图在C类中实现一个返回模板参数的constexpr成员函数。代码应该是c 11兼容的。然而,当模板化的类还包含STL容器作为数据成员时,比如STD::vector(const expr成员函数不涉及它),我会遇到编译问题。 以下代码给出了一个最小的示例: 代码使用命令正确编译 g -std=c 14 -O3 快速测试.cpp -o 测试 -Wall clang-STD = c 11-O3 qu

  • 我有一个片段,在这里我调用自定义视图类(Dragger) 并且我有另一个片段与和适配器,在其中我调用方法通过主机的活动的。 我发现在中旋转后会获得新的引用,但当我从适配器调用时-为空。 我真的不明白为什么字段得到引用,然后又丢失了它) 有人知道这有什么不对吗? 提前谢谢! P. S.:主机活动

  • 这里列出了所有文档化的结构体和联合体的成员变量,并附带结构或联合所属的文件: - a - addr : rt_i2c_bus_device , rt_i2c_msg ai_addr : addrinfo ai_addrlen : addrinfo ai_canonname : addrinfo ai_family : addrinfo ai_flags : addrinfo ai_next : a