Mon DialogFragment lance ClassCastException s'il est appelé depuis Fragment, alors qu'il fonctionne normalement s'il est appelé à partir d'une activité. J'ai déjà examiné quelques autres questions avec des problèmes similaires et essentiellement ceux qui sont liés aux importations, mais je n'ai pas été en mesure de le résoudre dans ma mise en œuvre. Voici ma mise en œuvre pour DialogFragment.DialogFragment lève ClassCastException si appelé à partir du fragment
import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; public class HotspotScanDialog extends DialogFragment { SetupHotspotDialogListener mListener; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { ... .setAdapter(hotspotAdapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mListener.onHotspotSelectedListener(hotspotAdapter.getItem( which).toString()); } })... } public interface SetupHotspotDialogListener { public void onHotspotSelectedListener(String selection); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (SetupHotspotDialogListener) activity; } catch (ClassCastException ignore) { // Just to make sure if anyone will be pointing at my throwing // ClassCastException myself I have tried without this code as well. throw new ClassCastException(activity.toString() + " must implement NoticeDialogListener"); } } }
Voici mon Fragment qui utilise le DialogFragment ci-dessus:
import android.app.AlertDialog; import android.app.DialogFragment; import android.support.v4.app.Fragment; import com.xxx.yyy.ui.compontent.dialog.HotspotScanDialog; import com.xxx.yyy.ui.compontent.dialog.HotspotScanDialog.SetupHotspotDialogListener; public class SmartMode extends Fragment implements SetupHotspotDialogListener { private void showWifiSelectionDialog() { DialogFragment setupWifiSelectionDialog = new HotspotScanDialog(); /* * using getFragmentManager() only says "The method * show(FragmentManager, String) in the type DialogFragment is not * applicable for the arguments (FragmentManager, String)" */ setupWifiSelectionDialog.show(getActivity().getFragmentManager(), Keys.TAG.toString()); } @Override public void onHotspotSelectedListener(String selection) { // Log.d(TAG,selection); } }
Ceci est le journal des erreurs:
02-01 13: 11: 32,750: E/AndroidRuntime (15061): FATAL EXCEPTION: principal 02-01 13: 11: 32.750: E/AndroidRuntime (15061): java.lang.ClassCastException: [email protected] doit implémenter NoticeDialogListener 02-01 13:11: 32.750: E/An droidRuntime (15061): à com.xxx.yyy.ui.compontent.dialog.HotspotScanDialog.onAttach (HotspotScanDialog.java:122) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): à android.app. FragmentManagerImpl.moveToState (FragmentManager.java:787) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): à l'adresse android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1035) 02-01 13:11: 32.750: E/AndroidRuntime (15061): à android.app.BackStackRecord.run (BackStackRecord.java:635) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): à android.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1397) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): à l'adresse android.app.FragmentManagerImpl $ 1.run (FragmentManager.java:426) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.os.Handler.handleCallback (Handler.java:615) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): à l'adresse android.os.Handler.dispatchMessage (Handler.java:92) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.os.Looper.loop (Looper.java:137) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): à l'adresse android.app.ActivityThread.main (ActivityThread.java:4898) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): à java.lang.reflect.Method.invokeNative (Méthode native) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): à java.lang.reflect .Method.invoke (Method.java:511) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): à l'adresse com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1006) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): sur com.android.internal.os.ZygoteInit.main (ZygoteInit.java:773) 02-01 13: 11: 32.750: E/Android Runtime (15061): at dalvik.system.NativeStart.main (méthode native)
Je me demande si quelqu'un peut donner un indice sur ce problème.
Si vous jetez un coup d'oeil à mon code, il est clair que "public class SmartMode extends Fragment implémente SetupHotspotDialogListener". Ce code fonctionne parfaitement avec l'activité et l'interface de rappel est également implémentée. Voulez-vous dire que je dois mettre en œuvre l'interface de l'activité principale qui héberge ces fragments? – Milan
Était pas exactement ce que je pensais, mais l'implémentation de ces interfaces dans l'activité qui a hébergé ces fragments a résolu mon problème. Bien que cela puisse être limité si vous essayez d'obtenir la liste de dialogue dans le fragment réel qui a appelé cette boîte de dialogue. Quoi qu'il en soit, merci pour l'indice. – Milan
J'ai modifié ma réponse.Je pense que la première partie de ma réponse n'est pas la meilleure solution. –