Android Studio 0.8.7
我有以下函数在片段中设置一些参数:
public static Fragment newInstance(UUID uuid) {
Log.d(TAG, "newInstance: " + uuid);
Bundle arguments = new Bundle();
arguments.putSerializable(EXTRA_JOB_ID, uuid);
DetailFragment fragment = new DetailFragment();
fragment.setArguments(arguments);
return fragment;
}
在我的onCreate()中,我使用getArguments检索参数,如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate()");
super.onCreate(savedInstanceState);
/* Get the arguments from the fragment */
UUID uuid = (UUID)getArguments().getSerializable(EXTRA_JOB_ID);
.
.
}
但是,有时会出现我不会发送任何要检索的参数的情况,在这种情况下我的程序会崩溃。
使用Intents有hasExtra方法来检查:
if(getActivity().getIntent().hasExtra(Intent.EXTRA_TEXT)) {
/* There is something to be retrieved */
}
我想知道是否有类似于getArguments的内容
非常感谢,
答案 0 :(得分:20)
作为对其他答案的替代建议,您的newInstance(...)
方法可以设计得稍好一些。就目前而言,即使您的UUID
参数为null
,它也始终会添加参数。
尝试将其更改为此...
public static Fragment newInstance(UUID uuid) {
Log.d(TAG, "newInstance: " + uuid);
DetailFragment fragment = new DetailFragment();
// Don't include arguments unless uuid != null
if (uuid != null) {
Bundle arguments = new Bundle();
arguments.putSerializable(EXTRA_JOB_ID, uuid);
fragment.setArguments(arguments);
}
return fragment;
}
然后在你onCreate(...)
的{{1}}方法中检查参数之前的其他事情......
Fragment
答案 1 :(得分:9)
Fragment.getArguments返回Bundle对象从其他组件发送的所有值。因此,您可以使用Bundle.containsKey检查密钥在收到的捆绑包中是否可用:
Bundle bundle=getArguments();
if(bundle !=null)
if(bundle.containsKey(EXTRA_JOB_ID)){
// get value from bundle..
}
答案 2 :(得分:3)
newInstance()
设计模式AFAIK的目的是保证您的片段在实例化时会提供参数。
换句话说,你调用newInstance(something)
的原因是因为你知道某些内容会被传递到fragment参数中,因此您始终可以从中检索某些内容片段的getArguments()
方法稍后。
因此,如果您计划将null作为参数传递,例如newInstance(null)
,哪种方式违背了使用newInstance设计模式的目的,你将获得一个nullpointer异常。
您可以调用getIntent.containsKey(EXTRA_JOB_ID)
来检查您的参数是否为空。