【问题标题】:Best way to instantiate a fragment?实例化片段的最佳方法?
【发布时间】:2016-01-25 11:51:29
【问题描述】:

方法一

public static MyFragment newInstance(int index) {

    MyFragment f = new MyFragment();

    Bundle args = new Bundle(1);

    args.putInt("index", index);

    f.setArguments(args);

    return f;

  }

使用

Myfragment.newInstance(1);

方法二

 public MyFragment newInstance(int index) {

    Bundle args = new Bundle(1);

    args.putInt("index", index);

    setArguments(args);

    return this;
  }

使用

new Myfragment().newInstance(1);

在上面的 sn-ps 中,哪一个是更合适和更可取的方式,请指出原因?

现在正在这样做..

 List<Fragment> fragments = new ArrayList<>();
            fragments.add(new MyFragment().newInstance(defaultId));
            int i = 1;
            for (Categories categories : mCategories) {
                String id = categories.getCategory_id();
                String name = categories.getCategory_name();
//                String slno = categories.getSlno();
                fragments.add(new MyFragment().newInstance(defaultId));
                Titles[i] = name;
                i++;
            }

这有什么问题吗?

【问题讨论】:

  • 第一个是静态工厂方法

标签: java android fragment


【解决方案1】:

方法 1 优于方法 2。

这是因为在方法 1 中,您确实创建了一个 MyFragment 对象。在方法 2 中,您首先创建一个MyFragment 对象,然后使用newInstance(...) 对其进行初始化。如果您想使用方法 2,我建议分两行进行:

MyFragment frag = new MyFragment();
frag.initialize(1);

使用初始化方法:

public void initialize(int index) {
    Bundle args = new Bundle(1);
    args.putInt("index", index);
    setArguments(args);
}

【讨论】:

  • 请告诉我..我在我的问题中编写的方法 2 中的代码有问题.??
  • 这很简单:您已经使用new MyFragment() 创建了一个新实例。之后,您使用称为newInstance() 的方法。这意味着它创建了(另一个)它没有的新实例!你在那里做的事情没有错,但这既不好也不常见!
【解决方案2】:

继续使用Method 1。始终尝试使用Static Factory Methods 而不是Constructors。为什么需要使用它可以在 Joshua Bloch 的着名书籍Effective Java 中找到:第 1 项 - 静态工厂方法。

您也可以参考:Effective Java By Joshua Bloch: Item1 - Static Factory Method

【讨论】:

  • 我正在循环片段并添加到List&lt;Fragment&gt; fragments = new ArrayList&lt;&gt;();,如果它是静态的,那么销毁活动时内存不会被释放知道吗?
  • 这是创建 Fragment 对象的静态方法。就这样。所以这不会导致任何内存问题。 Fragment 对象在此方法内将没有引用。请阅读有关有效 Java 的“第 1 项”。
  • 如果我使用静态方法可能也使用静态变量..关于那个? private static final String ARG_PAGE_ONE = "arg1"; private static final String ARG_PAGE_TWO = "arg2"; private static final String ARG_PAGE_THREE = "arg3"; public static HomeScreenTabs create(String categoryId, String categoryName, String userId, boolean isGuest) { HomeScreenTabs ob=new HomeScreenTabs(); Bundle bdl = new Bundle(4); bdl.putString(ARG_PAGE_ONE, categoryId); bdl.setArguments(bdl); return ob; }
  • 所以每次刷新这些变量的内存都不会正确分配?
  • 每次刷新页面时,即使在活动分发后,仍有大量静态变量保持活动状态..
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
相关资源
最近更新 更多