aufgerufen wird. My DialogFragment löst ClassCastException aus, wenn sie von Fragment aufgerufen wird, während sie normal funktioniert, wenn sie von einer Aktivität aufgerufen wird. Ich habe mir bereits einige andere Fragen mit ähnlichen Problemen angeschaut, die im Wesentlichen mit Importen zu tun haben, aber ich konnte sie in meiner Implementierung nicht lösen. Hier ist meine Implementierung für DialogFragment.DialogFragment löst ClassCastException aus, wenn sie von 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"); } } }
Hier ist mein Fragment, das die oben DialogFragment verwendet:
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); } }
Dies ist das Fehlerprotokoll:
02-01 13: 11: 32.750: E/Android Runtime (15061): FATALE AUSNAHME: Haupt 02-01 13: 11: 32.750: E/AndroidRuntime (15061): java.lang.ClassCastException: [email protected] muss NoticeDialogListener implementieren 02-01 13:11: 32.750: E/An droidRuntime (15061): at com.xxx.yyy.ui.compontent.dialog.HotspotScanDialog.onAttach (HotspotScanDialog.java:122) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): bei android.app. FragmentManagerImpl.moveToState (FragmentManager.java:787) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): bei android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1035) 02-01 13:11: 32.750: E/AndroidRuntime (15061): bei android.app.BackStackRecord.run (BackStackRecord.java:635) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): bei android.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1397) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): bei android.app.FragmentManagerImpl $ 1.run (FragmentManager.java:426) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): bei android.os.Handler.handleCallback (Handler.java:615) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): bei android.os.Handler.dispatchMessage (Handler.java:92) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): um android.os.Looper.loop (Looper.java:137) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): bei android.app.ActivityThread.main (ActivityThread.java:4898) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): um java.lang.reflect.Method.invokeNative (native Methode) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at java.lang.reflect .Method.invoke (Methode.java:511) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): um com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 1006) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): unter com.android.internal.os.ZygoteInit.main (ZygoteInit.java:773) 02-01 13: 11: 32.750: E/Android Laufzeit (15061): at dalvik.system.NativeStart.main (Native Methode)
Ich frage mich, ob jemand einen Hinweis auf dieses Problem geben kann.
Wenn Sie sich meinen Code genau anschauen, heißt es klar "öffentliche Klasse SmartMode erweitert Fragment implementiert SetupHotspotDialogListener". Dieser Code funktioniert perfekt mit der Aktivität und es ist auch die Callback-Schnittstelle implementiert. Meinst du, dass ich die Schnittstelle die Hauptaktivität implementieren muss, die diese Fragmente hostet? – Milan
War nicht genau das, was ich dachte, aber das Implementieren dieser Schnittstelle in der Aktivität, die diese Fragmente beherbergte, löste mein Problem. Dies kann jedoch eingeschränkt werden, wenn Sie versuchen, eine Dialogliste in das eigentliche Fragment zu bringen, das dieses Dialogfeld aufgerufen hat. Wie auch immer, danke für den Hinweis. – Milan
Ich habe meine Antwort bearbeitet.Ich denke, der erste Teil meiner Antwort ist nicht die beste Lösung. –