My DialogFragment zgłasza ClassCastException, jeśli wywoływana jest z fragmentu, podczas gdy działa normalnie, jeśli wywoływana jest z działania. Rozważałem już kilka innych pytań o podobnym problemie i zasadniczo są one związane z importem, ale nie byłem w stanie go rozwiązać w mojej implementacji. Oto moja implementacja dla DialogFragment.Funkcja DialogFragment zgłasza wyjątek ClassCastException, jeśli wywoływana jest z fragmentu
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"); } } }
Oto moja Fragment, który jest przy użyciu powyższej DialogFragment:
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); } }
To jest dziennik błędów:
02-01 13: 11: 32,750: E/Android Runtime (15061): WYJĄTKOWA WYSTAWA: główna 02-01 13: 11: 32.750: E/AndroidRuntime (15061): java.lang.ClassCastException: [email protected] musi wdrożyć NoticeDialogListener 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): at android.app. FragmentManagerImpl.moveToState (FragmentManager.java:787) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): na Android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1035) 02-01 13:11: 32.750: E/AndroidRuntime (15061): at android.app.BackStackRecord.run (BackStackRecord.java:635) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): w android.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1397) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): na 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): na android.os.Handler.dispatchMessage (Handler.java:92) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): o android.os.Looper.loop (Looper.java:137) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at android.app.ActivityThread.main (ActivityThread.java:4898) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): w java.lang.reflect.Method.invokeNative (metoda macierzysta) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): at java.lang.reflect .Method.invoke (Method.java:511) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): na com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1006) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): na com.android.internal.os.ZygoteInit.main (ZygoteInit.java:773) 02-01 13: 11: 32.750: E/Android Środowisko wykonawcze (15061): w dalvik.system.NativeStart.main (metoda macierzysta)
Zastanawiam się, czy ktoś może dać wskazówkę na temat tego problemu.
Jeśli przyjrzysz się dokładnie mojemu kodowi, wyraźnie powiesz "public class SmartMode rozszerza Fragment implements SetupHotspotDialogListener". Ten kod działa doskonale z działaniem i jest również implementowany interfejs wywołania zwrotnego. Czy masz na myśli, że muszę zaimplementować interfejs jako główną aktywność, która obsługuje te fragmenty? – Milan
Nie było to dokładnie to, o czym myślałem, ale wdrożenie tego interfejsu w działaniu, które hostowało te fragmenty rozwiązało mój problem. Chociaż może to być ograniczone, jeśli próbujesz uzyskać listę dialogów do faktycznego fragmentu, który wywołał to okno dialogowe. W każdym razie dzięki za podpowiedź. – Milan
Edytowałem swoją odpowiedź.Myślę, że pierwsza część mojej odpowiedzi nie jest najlepszym rozwiązaniem. –