Callback de DialogFragment a Fragmento de destino utilizando la interfaz

Estoy tratando de enviar algunos datos de un dialogfragment de dialogfragment al fragment destino pero no funciona.

He escrito el siguiente código, pero a través de la exception :

 java.lang.NullPointerException: Attempt to invoke interface method 'void com.xxFragmentAlertDialog$Communicator.setI(java.lang.String)' on a null object reference 

Código:

 public class FragmentAlertDialog extends DialogFragment { Communicator callback; public interface Communicator { void setI(String name); } public static FragmentAlertDialog newInstance(String id, int title, int items) { FragmentAlertDialog frag = new FragmentAlertDialog(); Bundle args = new Bundle(); args.putString("id", id); args.putInt("title", title); args.putInt("items", items); frag.setArguments(args); return frag; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); callback = (Communicator) getTargetFragment(); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { String id = getArguments().getString("id"); int title = getArguments().getInt("title"); String[] items = getResources().getStringArray(getArguments().getInt("items")); switch (id) { case MainActivity.DIALOG_1: return new AlertDialog.Builder(getActivity()) .setTitle(title) .setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { callback.setI("Important Data"); } }).create(); } return null; } 

Clase de fragmento

 public class FragmentXYXY extends Fragment implements View.OnClickListener, FragmentAlertDialog.Communicator { @Override public void onClick(View v) { switch (v.getId()) { case R.id.et_i: DialogFragment newFragment = FragmentAlertDialog.newInstance(MainActivity.DIALOG_I, R.string.i_select, R.array.i_array); newFragment.setTargetFragment(this, 0); newFragment.show(getFragmentManager(), "dialog"); } } @Override public void setI(String name) { textI.setText(name); } 

¿Puede alguien por favor ayuda. Gracias

Código modificado: newFragment.setTargetFragment (esto, 0);

Usted tiene que llamar setTargetFragment

 setTargetFragment(this, 0); 

Con el fin de obtener una referencia FragmentXYXY , en su DialogFragment .

 @Override public void onClick(View v) { switch (v.getId()) { case R.id.et_i: DialogFragment newFragment = FragmentAlertDialog.newInstance(MainActivity.DIALOG_I, R.string.i_select, R.array.i_array); newFragment.setTargetFragment(this, 0); newFragment.show(getFragmentManager(), "dialog"); } } 

Por ejemplo, puede hacerlo así:

 public interface DialogClickListener { public void onYesClick(); public void onNoClick(); } public class MyListFragment extends ListFragment implements DialogClickListener { ... private void showDialog() { DialogFragment dialog = new MyDialogFragment(); dialog.setTargetFragment(this, 0); dialog.show(getFragmentManager(), "dialog"); } @Override public void onYesClick() { // do something } @Override public void onNoClick() { // do something } } public class MyDialogFragment extends DialogFragment { private DialogClickListener callback; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { callback = (DialogClickListener) getTargetFragment(); } catch (ClassCastException e) { throw new ClassCastException("Calling fragment must implement DialogClickListener interface"); } } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("message") .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { callback.onYesClick(); } }).setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { callback.onNoClick(); } }); return builder.create(); } } 

Para más detalles, consulte este enlace

  • Método opcional en la interfaz Java
  • Utilizar lista de matrices de objetos como adaptador de hiladora
  • Devuelve un valor después del método Activity.runOnUiThread ()
  • Diferenciar los diálogos individuales con DialogInterface.OnClickListener
  • Reflexión Java: implementa la interfaz y pasa a otra clase
  • Fuentes personalizadas y diseños XML (Android)
  • ¿Es posible utilizar la herencia en las interfaces AIDL?
  • ¿Podemos usar un ScrollView dentro de un LinearLayout?
  • Determinación de tamaños de imagen para varios tamaños / densidades de pantalla de Android
  • Llamar a funciones javascript en una vista web desde la clase de actividad
  • ¿Es necesario establecer los oyentes de la interfaz Fragment a null en detach?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.