gpt4 book ai didi

java - Fragments 中的成员变量与 setArguments

转载 作者:IT老高 更新时间:2023-10-28 13:17:17 25 4
gpt4 key购买 nike

我注意到,在 Fragments 的 Android 引用资料(特别是 DialogFragment)中,它们做了一些与我预期不同的事情:

1)。使用 public static foo newInstance() 方法而不是构造函数。
2)。使用 setArguments 而不是成员变量将值传递给 onCreateDialog。

我读到 newInstance 在使用反射时似乎更可取。但是我真的不明白他们为什么要通过包传递参数。虽然使用成员变量会更安全(不使用字符串从 map 中获取)并且开销会更少。

有什么想法吗?

最佳答案

我也偶然发现了这一点,并发现使用参数 Bundle 优于实例字段:

  • 如果它在 Bundle 中,Android 系统知道它并可以创建和销毁您的 Fragment(使用强制的无参数/默认构造函数和通常的生命周期方法),然后再次传入参数包。这样一来,内存不足的杀戮狂欢或最终的方向变化就不会丢失任何争论(这经常让我在旋转较少的模拟器中开发后第一次部署到真实设备时感到震惊)。

  • 您可以将 Activity 的额外 Bundle 原样传递给嵌入在布局中的 Fragment;例如当我有一个显示 Fragment “全屏”并且需要一些 ID(或 ContentProvider URI)来知道要做什么的 Activity 时,我经常使用它显示/做。有时我什至会在传递之前向 Bundle (或副本)添加更多内容,例如

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState == null) { // not a re-creation
    final Bundle args = new Bundle(getIntent().getExtras());
    args.putInt(CoverImageFragment.BACKGROUND_RESOURCE, android.R.color.black);
    final Fragment fragment = CoverImageFragment.newInstance(args);
    getSupportFragmentManager()
    .beginTransaction()
    .add(android.R.id.content, fragment)
    .commit();
    }
    }
  • 它使Fragment的开发方式接近于Activity,即Bundle作为“输入参数,没有异常(exception)”。

至于你提到的缺点:

  • 我认为开销很小,因为您很可能不会在紧密循环中查询 Bundle,因此在 onCreate()onViewCreate() 等还不错。

  • 为了类型安全,Bundle 具有所有不同的 getXXXX() 方法,甚至在缺少某些内容/可选的情况下重载以提供默认值:)

至于 newInstance() 方法,我认为它们是封装 newsetArguments() 调用的简单方法我的 fragment ;我有时会提供一个额外的 MyFragment newInstance(String singleIdOfWhatToDisplay) 一次性创建 BundleFragment 并返回一个准备就绪 fragment 实例。

关于java - Fragments 中的成员变量与 setArguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6677136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com