Compruebe que getArguments tiene algunos datos que se recuperarán

Android Studio 0.8.7 

Tengo la siguiente función que establece un argumento en el fragmento:

  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; } 

En mi onCreate () recupero los argumentos usando getArguments como este:

 @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); . . } 

Sin embargo, a veces hay una situación en la que no voy a enviar ningún argumento para ser recuperado, y mi programa se bloqueará en ese caso.

El uso de Intents tiene el método hasExtra para comprobar esto:

  if(getActivity().getIntent().hasExtra(Intent.EXTRA_TEXT)) { /* There is something to be retrieved */ } 

Me pregunto si hay algo similar con getArguments

Muchas gracias de antemano,

Como sugerencia alternativa a las otras respuestas, su newInstance(...) podría diseñarse un poco mejor. En su estado actual, siempre agrega argumentos incluso si su parámetro UUID es null .

Intenta cambiarlo a este …

 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; } 

Luego, en el onCreate(...) de tu Fragment comprueba los argumentos antes de cualquier otra cosa …

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

Fragment.getArguments devuelve un objeto Bundle que envía todos los valores desde otro componente. Por lo que puede utilizar Bundle.containsKey para comprobar si la clave está disponible en el paquete recibido o no:

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

El propósito del patrón de diseño newInstance() AFAIK es que usted garantice que su fragmento tendrá los argumentos suministrados cuando se instancia.

En otras palabras, la razón por la que llamas newInstance(something) es porque sabes que algo pasará al argumento fragmentos, así que siempre puedes recuperar algo del método getArguments() del fragmento más adelante.

Así que si planeas pasar null como un argumento, por ejemplo, newInstance(null) , qué tipo de derrotas el propósito de usar el patrón de diseño newInstance, vas a obtener una excepción nullpointer.

Puede llamar a getIntent.containsKey(EXTRA_JOB_ID) para comprobar si su argumento es nulo o no.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.