什么是setArguments点?
您好我正在看Android的网站上的以下片段的例子。
http://developer.android.com/guide/components/fragments.html#Example
我想知道为什么某些方法被执行。
为什么detailsFragment
例子,在detailsFragment
是执行下面的方法:
public static DetailsFragment newInstance(int index) { DetailsFragment f = new DetailsFragment(); // Supply index input as an argument. Bundle args = new Bundle(); args.putInt("index", index); f.setArguments(args); return f; }
你不能也简单地实例化DetailsFragment
并使用setter方法来设置index
。 绕过整个setArguments
。
首先使用setArguments
什么意义? 你能不能只使用setters和getters?
你可以使用getter和setter,但是通过传入一个bundle,你不需要编写这个代码,因为它已经在那里了。 另外,我相信如果屏幕方向改变,这些参数会自动传入,这也使得生活更轻松。
实质上,setArguments和getArguments只是Googlebuild议您遵循的devise模式:
每个片段必须有一个空的构造函数,所以在恢复其活动状态时,它可以被实例化。 强烈build议子类没有带参数的其他构造函数,因为这些构造函数在重新实例化时不会被调用。 相反,调用者可以用setArguments(Bundle)提供参数,然后用getArguments()方法检索片段。 http://developer.android.com/reference/android/app/Fragment.html
我把它包括在你的Fragment中也需要使用的setters。 再说一遍 – 没有什么事情可以迫使你这样做,而且正如你所知道的那样 – 并不是唯一的办法。
只要加上Matthew的回答:他正确地引用了Fragments需要一个空的构造函数,以便框架可以在需要的时候重新实例化它们。
使用getter和setter是很好的,但是由于框架可能会破坏并重新创build你的Fragment,所以你必须确保不会丢失这些参数。
这必须通过Fragment.onSaveInstanceState()
。 保存的声明将作为参数savedInstanceState
在Fragment.onCreate()
, Fragment.onCreateView()
和其他几个方法中传回给你。
使用Fragment.setArguments()
(在大多数情况下,我假设)更容易,在框架将自动保留的参数,从而将为你做大部分的工作。
Setter可能是最初提供给Fragment的参数的方法,而且片段可能会随着时间的推移而自行调整。 在这种情况下单独处理savedInstanceState可能比处理savedInstanceState和参数更容易 – 必须在此处作出有效参数的决定。
public void setArguments (Bundle args)
提供这个片段的构造参数。 这只能在片段附加到其活动之前调用; 也就是说,你应该在构造片段之后立即调用它。 这里提供的参数将保留在片段销毁和创build (可能是以前的官方文档中缺less的粗体文本)
Fragments.setArguments(Bundle args)
另外setter可能被滥用。 如果updateSomeOtherStuff()会改变一些视图,将会崩溃。
public class MyFragment extends Fragment { void setData(someData){ this.someData = someData; updateSomeOtherStuff() } }
如果传递一个包,就不可能误用这个setter,而且你总是会知道这将在生命周期方法中被设置。