我正在实施一个Android片段。我知道框架可以自动销毁并重新创建片段,并且重新创建片段会调用其默认构造函数,而不是具有参数的构造函数。
有很多帖子(例如this question的接受答案)显示了如何通过实现静态newInstance
方法为片段提供参数。
我不明白的是谁叫newInstance
。我的第一印象是 - 因为可以为这个newInstance
方法定义任意参数 - 我应该在应用程序的某个地方添加一个显式调用,并且名称newInstance
只是一个命名约定。但是,除了框架调用默认构造函数创建的第二个片段之外,我还要创建第二个片段,这让我很困惑。
上面的假设是不正确的,newInstance
方法实际上是Java用于实例化类的内置方法的重载?在那种情况下,我看不出如何定义采用任意参数列表的newinstance
方法。或者这可能在Java中,我只是不太了解Java?
答案 0 :(得分:5)
您可以根据需要为该功能命名:newInstance
,getInstance
,newFragment
。没关系,它只是一种辅助方法。重要的是,您将所有参数都放在fragment.setArguments(args)
。 Android系统会记住这些参数,并在重新创建片段时使用它们。
public static MyFragment newInstance(int arg) {
Bundle args = new Bundle();
args.putInt("ARG", arg);
MyFragment fragment = new MyFragment();
fragment.setArguments(args);
return fragment;
}
答案 1 :(得分:2)
newInstance
是Android设计模式,因为Fragment
不应该有任何其他Constructor
beside the default Constructor
因此,您定义了一个Helper函数,以便将Arguments传递给Fragment
您不必使用它,但假设您有2 Activities
两者都开始FragmentA
如果你不使用辅助函数你将需要复制代码来实例化片段。
我不明白的是谁调用newInstance
通常,您会在创建instantiate
... Fragments
,Activity
等的地方使用Adapter
方法。
SectionPagerAdapter
示例:
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
return PlaceholderFragment.newInstance(position + 1);
}
PlaceholderFragment.newInstance(int position)
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
在这种情况下,我看不出如何定义采用任意参数列表的newinstance方法。
您可以传递任意参数列表,但您需要知道值Type
,因为Bundle
只有putX()
个方法,其中X是参数的类型