检查getArguments是否有一些要检索的数据

Android Studio 0.8.7 

我有以下function,在片段中设置一些参数:

  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

提前谢谢了,

Solutions Collecting From Web of "检查getArguments是否有一些要检索的数据"

作为其他答案的替代build议,您的newInstance(...)方法可以devise得稍微好一些。 就目前而言,即使您的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; } 

然后在你的FragmentonCreate(...)方法检查参数之前什么其他…

 Bundle arguments = getArguments(); if (arguments != null && arguments.containsKey(EXTRA_JOB_ID)) UUID uuid = (UUID)arguments().getSerializable(EXTRA_JOB_ID); 

Fragment.getArguments返回一个Bundle对象从其他组件发送的所有值。 所以你可以使用Bundle.containsKey来检查密钥是否在接收包中可用:

  Bundle bundle=getArguments(); if(bundle !=null) if(bundle.containsKey(EXTRA_JOB_ID)){ // get value from bundle.. } 

newInstance()devise模式AFAIK的目的是保证你的片段在实例化时会提供给它的参数。

换句话说,你调用newInstance(something)的原因是因为你知道一些东西会被传入到fragments参数中,所以你以后总是可以从fragment的getArguments()方法中获取一些东西

所以,如果你打算将null作为parameter passing,比如newInstance(null) ,那么这种方法会失败使用newInstancedevise模式的目的,你会得到一个空指针exception。

你可以调用getIntent.containsKey(EXTRA_JOB_ID)来检查你的参数是否为null。