My DialogFragment genera ClassCastException se chiamato da Fragment, mentre funziona normalmente se chiamato da un'attività. Ho già esaminato poche altre domande con problemi simili e sostanzialmente quelle relative alle importazioni, ma non sono stato in grado di risolverlo nella mia implementazione. Ecco la mia implementazione per DialogFragment.DialogFragment genera ClassCastException se chiamato da Frammento
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"); } } }
Ecco il mio Frammento che utilizza il DialogFragment sopra:
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); } }
Questo è il log degli errori:
02-01 13: 11: 32.750: E/AndroidRuntime (15061): FATAL EXCEPTION: main 02-01 13: 11: 32.750: E/AndroidRuntime (15061): java.lang.ClassCastException: [email protected] deve implementare NoticeDialogListener 02-01 13:11: 32.750: E/An droidRuntime (15061): su com.xxx.yyy.ui.compontent.dialog.HotspotScanDialog.onAttach (HotspotScanDialog.java:122) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): su android.app. FragmentManagerImpl.moveToState (FragmentManager.java:787) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): su android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1035) 02-01 13:11: 32.750: E/AndroidRuntime (15061): su android.app.BackStackRecord.run (BackStackRecord.java:635) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): su android.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1397) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): su android.app.FragmentManagerImpl $ 1.run (FragmentManager.java:426) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): su android.os.Handler.handleCallback (Handler.java:615) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): su android.os.Handler.dispatchMessage (Handler.java:92) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): in android.os.Looper.loop (Looper.java:137) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): su android.app.ActivityThread.main (ActivityThread.java:4898) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): su java.lang.reflect.Method.invokeNative (metodo nativo) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): su java.lang.reflect .Method.invoke (Method.java:511) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1006) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): a com.android.internal.os.ZygoteInit.main (ZygoteInit.java:773) 02-01 13: 11: 32.750: E/Android Runtime (15061): at dalvik.system.NativeStart.main (Native Method)
Mi chiedo se qualcuno può dare un suggerimento su questo problema.
Se si analizza correttamente il mio codice, si dice chiaramente "SmartMode di classe pubblica estende Fragment implementa SetupHotspotDialogListener". Questo codice funziona perfettamente con l'attività e anche l'interfaccia di callback è implementata. Vuoi dire che devo implementare l'interfaccia l'attività principale che ospita questi frammenti? – Milan
Non era esattamente quello che pensavo, ma implementare quell'interfaccia nell'attività che ospitava quei frammenti ha risolto il mio problema. Anche se questo può essere limitato se si sta cercando di ottenere l'elenco delle finestre di dialogo nel frammento effettivo che ha chiamato quella finestra di dialogo. Comunque grazie per il suggerimento. – Milan
Ho modificato la mia risposta.Penso che la prima parte della mia risposta non sia la soluzione migliore. –