ClassCastException - получение ссылки вида Activity из класса адаптера для фрагмента диалога - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть действие с EditText и Dialogfragment. Для DialogFragment у меня есть ListView и класс Adapter для этого списка. У списка есть TextView и кнопка. Я хочу записать текст элемента списка в EditText of Activity по нажатию кнопки элемента списка (и затем закрыть диалоговое окно). В значительной степени я достиг всего этого, но он показывает 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$000(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 устройствах.

1 Ответ

1 голос
/ 17 февраля 2020

при инициализации класса адаптера в качестве альтернативы можно передать ссылку на действие, как показано ниже.

public class MyAdapter(Activity activity)

и при создании экземпляра адаптера во фрагменте диалога

Adapter adapter = new Adapter(getActivity());

в этом случае getActivity метод вернет вам прикрепленное действие к фрагменту диалога.

И, наконец, вы сможете использовать экземпляр действия вашего адаптера, как показано ниже

 EditText editText = activity.findViewById(R.id.write_text);

другой подход может заключаться в создании связи через интерфейсы

regards

...