ClassCastException - 从对话框片段的适配器 class 获取 Activity 的视图引用
ClassCastException - getting Activity's view reference from adapter class for dialog fragment
我有一个 activity,它有一个 EditText 和一个 Dialogfragment。对于 DialogFragment,我有一个 ListView 和一个用于该列表视图的适配器 class。列表视图有一个 TextView 和一个按钮。我想在单击列表项的按钮时将列表项的文本写入 Activity 的 EditText(然后关闭对话框)。我几乎已经实现了这一切,但它在某些设备中显示了 ClassCastException。这是列表项的 Button clickListener:
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText=((MainActivity)v.getContext()).findViewById(R.id.write_text);
editText.removeTextChangedListener(((MainActivity) Objects.requireNonNull(v.getContext())).textWatcher);
editText.addTextChangedListener(((MainActivity) Objects.requireNonNull(v.getContext())).textWatcher2);
editText.getText().insert(editText.getSelectionStart(), listData.get(position).getBio());
editText.removeTextChangedListener(((MainActivity) Objects.requireNonNull(v.getContext())).textWatcher2);
editText.addTextChangedListener(((MainActivity) Objects.requireNonNull(v.getContext())).textWatcher);
dialog.dismiss();
}
});
我不明白为什么会有ClassCastException。这是来自 Crashlytics 的堆栈跟踪:
Fatal Exception: java.lang.ClassCastException: b.b.q.v0 cannot be cast to com.xx.xx.xx.MainActivity
at com.xx.xx.Adapters.ListAdapter.access[=13=]0(ListAdapter.java)
at android.view.View.performClick(View.java:4508)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java)
at android.view.View$PerformClick.run(View.java:18675)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5590)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1280)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1096)
at dalvik.system.NativeStart.main(NativeStart.java)
任何帮助将不胜感激。
编辑:它仅在 Android 4.4 设备中发生。
当您初始化您的适配器时 class 作为替代方案,可以传递一个 activity 引用,如下所示。
public class MyAdapter(Activity activity)
当您在对话框片段中创建适配器实例时
Adapter adapter = new Adapter(getActivity());
在这种情况下,getActivity
方法将 return 您将 activity 附加到对话片段。
最后,您将能够使用 activity 实例化您的适配器,如下所示
EditText editText = activity.findViewById(R.id.write_text);
另一种方法可能是通过接口创建通信
问候
我有一个 activity,它有一个 EditText 和一个 Dialogfragment。对于 DialogFragment,我有一个 ListView 和一个用于该列表视图的适配器 class。列表视图有一个 TextView 和一个按钮。我想在单击列表项的按钮时将列表项的文本写入 Activity 的 EditText(然后关闭对话框)。我几乎已经实现了这一切,但它在某些设备中显示了 ClassCastException。这是列表项的 Button clickListener:
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText=((MainActivity)v.getContext()).findViewById(R.id.write_text);
editText.removeTextChangedListener(((MainActivity) Objects.requireNonNull(v.getContext())).textWatcher);
editText.addTextChangedListener(((MainActivity) Objects.requireNonNull(v.getContext())).textWatcher2);
editText.getText().insert(editText.getSelectionStart(), listData.get(position).getBio());
editText.removeTextChangedListener(((MainActivity) Objects.requireNonNull(v.getContext())).textWatcher2);
editText.addTextChangedListener(((MainActivity) Objects.requireNonNull(v.getContext())).textWatcher);
dialog.dismiss();
}
});
我不明白为什么会有ClassCastException。这是来自 Crashlytics 的堆栈跟踪:
Fatal Exception: java.lang.ClassCastException: b.b.q.v0 cannot be cast to com.xx.xx.xx.MainActivity
at com.xx.xx.Adapters.ListAdapter.access[=13=]0(ListAdapter.java)
at android.view.View.performClick(View.java:4508)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java)
at android.view.View$PerformClick.run(View.java:18675)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5590)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1280)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1096)
at dalvik.system.NativeStart.main(NativeStart.java)
任何帮助将不胜感激。
编辑:它仅在 Android 4.4 设备中发生。
当您初始化您的适配器时 class 作为替代方案,可以传递一个 activity 引用,如下所示。
public class MyAdapter(Activity activity)
当您在对话框片段中创建适配器实例时
Adapter adapter = new Adapter(getActivity());
在这种情况下,getActivity
方法将 return 您将 activity 附加到对话片段。
最后,您将能够使用 activity 实例化您的适配器,如下所示
EditText editText = activity.findViewById(R.id.write_text);
另一种方法可能是通过接口创建通信
问候