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
:
- ¿Cómo crear la interfaz entre el fragmento y el adaptador?
- El archivo AIDL no genera un archivo Java
- Soporte de RTL: deshabilitarlo sólo para componentes de interfaz de usuario específicos
- Herencia cíclica e interfaces - la clase A no puede implementar la interfaz de clase B mientras que la clase B implementa una interfaz
- Cómo insertar ImageView al final de multilínea TextView?
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);
- reutilizar las mismas instancias de Diálogos
- Fundamentos de Android Fragments: ¿por qué? ¿Es esto conceptualmente erróneo?
- Cambiar el fondo de la actividad del código
- Interfaces de Android y onCreate ()
- Proguard de Android problema de interfaz de Javascript
- Cómo enlazar una actividad a un servicio y controlar y administrar el servicio desde la actividad
- Cómo comunicarse entre dos Fragmentos de niño dentro de un Fragmento anidado
- Equivalente webkit de escritorio de Android addJavascriptInterface ()?
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