相关疑难解决方法(0)

实例化新Android片段的最佳实践

我已经看到了两个在应用程序中实例化新Fragment的一般实践:

Fragment newFragment = new MyFragment();
Run Code Online (Sandbox Code Playgroud)

Fragment newFragment = MyFragment.newInstance();
Run Code Online (Sandbox Code Playgroud)

第二个选项使用静态方法newInstance(),通常包含以下方法.

public static Fragment newInstance() 
{
    MyFragment myFragment = new MyFragment();
    return myFragment;
}
Run Code Online (Sandbox Code Playgroud)

起初,我认为主要的好处是我可以重载newInstance()方法以在创建Fragment的新实例时提供灵活性 - 但我也可以通过为Fragment创建重载构造函数来实现这一点.

我错过了什么?

一种方法比另一种方法有什么好处?还是只是好习惯?

android android-fragments

677
推荐指数
7
解决办法
30万
查看次数

理解Fragment的setRetainInstance(boolean)

从文档开始:

public void setRetainInstance(boolean retain)

控制是否在活动重新创建(例如从配置更改)中保留片段实例.这只能用于不在后栈中的片段.如果设置,则在重新创建活动时,片段生命周期会略有不同:

  • onDestroy()不会被调用(但是onDetach()仍然会被调用,因为片段正在与其当前活动分离.
  • 因为片段没有被重新创建,所以不会调用onCreate(Bundle).
  • onAttach(Activity)和onActivityCreated(Bundle)仍将被调用.

我有一些问题:

  • 片段是否也保留其视图,还是会在配置更改时重新创建?"保留"究竟是什么意思?

  • 当用户离开活动时,片段是否会被销毁?

  • 为什么它不适用于后端堆栈上的碎片?

  • 哪个是使用此方法有意义的用例?

android android-fragments

328
推荐指数
4
解决办法
16万
查看次数

在Android中旋转设备后片段字段为NULL

当我启动应用程序时一切正常,但是当我旋转到横向时它崩溃了,因为在Fragment那里有一个字段是NULL.

我不使用setRetainInstance(true)或添加 FragmentsFragmentManager在应用程序启动和应用程序旋转时创建新的 Fragments。

Activity OnCreate()我创建Fragment并将它们添加到viewPager这样的。

   protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         ParentBasicInfoFragment parentBasicInfoFragment = new ParentBasicInfoFragment();
         ParentUTCFragment parentUTCFragment = new ParentUTCFragment();
         ParentEventsFragment parentEventsFragment = new ParentEventsFragment();
         this.mFragments = new ArrayList<>();
         this.mFragments.add(parentBasicInfoFragment);
         this.mFragments.add(parentUTCFragment);
         this.mFragments.add(parentEventsFragment);
         this.viewpage.setOffscreenPageLimit(3);
         setCurrentTab(0);
         this.viewpage.setAdapter(new MainActivityPagerAdapter(getSupportFragmentManager(), this.mFragments));
    }
Run Code Online (Sandbox Code Playgroud)

然后我在应用程序上有一个测试按钮,当我按下它时会像

  public void test(View view) {
      ((BaseFragment) MainActivity.this.mFragments.get(MainActivity.this.viewpage.
                getCurrentItem())).activityNotifiDataChange("hello");
  }
Run Code Online (Sandbox Code Playgroud)

这将工作和当前FragmentsViewPager有方法, activityNotifiDataChange()正在调用,一切正常。

当我旋转应用程序并按下按钮做同样的事情时,activityNotifiDataChange()它被调用了,但是有一个空指针异常,因为 ArrayList<Fragment> mFragment它现在是 NULL。

这是一个显示此行为的小示例 Android …

android android-fragments

2
推荐指数
1
解决办法
986
查看次数

标签 统计

android ×3

android-fragments ×3