DialogFragment của tôi ném ClassCastException nếu được gọi từ Fragment, trong khi nó hoạt động bình thường nếu được gọi từ một Activity. Tôi đã xem xét một vài câu hỏi khác với vấn đề tương tự và về cơ bản những câu hỏi đó có liên quan đến hàng nhập khẩu, nhưng tôi đã không thể giải quyết nó trong quá trình thực hiện của mình. Đây là thực hiện của tôi cho DialogFragment.DialogFragment ném ClassCastException nếu được gọi từ 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"); } } }
Đây là Fragment của tôi đó là sử dụng các DialogFragment trên:
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); } }
Đây là bản ghi lỗi:
02-01 13: 11: 32,750: E/AndroidRuntime (15061): CHỨC NĂNG CHẤT LƯỢNG: chính 02-01 13: 11: 32.750: E/AndroidRuntime (15061): java.lang.ClassCastException: [email protected] phải triển khai NoticeDialogListener 02-01 13:11: 32,750: E/An droidRuntime (15061): tại com.xxx.yyy.ui.compontent.dialog.HotspotScanDialog.onAttach (HotspotScanDialog.java:122) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại android.app. FragmentManagerImpl.moveToState (FragmentManager.java:787) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1035) 02-01 13:11: 32.750: E/AndroidRuntime (15061): tại android.app.BackStackRecord.run (BackStackRecord.java:635) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại android.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1397) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại android.app.FragmentManagerImpl $ 1.run (FragmentManager.java:426) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại android.os.Handler.handleCallback (Handler.java:615) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại android.os.Handler.dispatchMessage (Handler.java:92) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại android.os.Looper.loop (Looper.java:137) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại android.app.ActivityThread.main (ActivityThread.java:4898) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại java.lang.reflect.Method.invokeNative (Phương thức Gốc) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại java.lang.reflect .Method.invoke (Method.java WEBC11) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1006) 02-01 13: 11: 32.750: E/AndroidRuntime (15061): tại com.android.internal.os.ZygoteInit.main (ZygoteInit.java:773) 02-01 13: 11: 32.750: E/Android Thời gian chạy (15061): tại dalvik.system.NativeStart.main (Phương thức Gốc)
Tôi tự hỏi liệu có ai có thể đưa ra gợi ý về vấn đề này không.
Nếu bạn xem xét kỹ mã của tôi, nó nói rõ ràng "Lớp công khai SmartMode mở rộng các cài đặt Fragment SetupHotspotDialogListener". Mã này hoạt động hoàn hảo với hoạt động và giao diện gọi lại cũng được thực hiện. Bạn có nghĩa là tôi phải thực hiện giao diện các hoạt động chính mà lưu trữ các mảnh vỡ? – Milan
Không phải là excatly những gì tôi nghĩ nhưng, thực hiện những giao diện trong hoạt động lưu trữ những mảnh vỡ giải quyết vấn đề của tôi. Mặc dù điều này có thể được giới hạn nếu bạn đang cố gắng để có được danh sách hộp thoại vào mảnh thực tế được gọi là hộp thoại đó. Anyways cảm ơn cho gợi ý. – Milan
Tôi đã chỉnh sửa câu trả lời của mình.Tôi nghĩ rằng phần đầu tiên của câu trả lời của tôi không phải là giải pháp tốt nhất. –