Не получается показать AlertDialog.Builder

142
17 января 2019, 14:10

Всем привет, у меня есть адаптер и там или уже в моделе я пытаюсь вывести диалог чтобы подтвердить или удалить действие пользователя но постоянно вылетает ошибка, в гугле нашел лишь кучу похожиш вещей в которых написано использовать getapplicationContext() - но это не помогает какой-бы контекст я не вызвал. Подскажите пожалуйста как решить проблему, вот код адаптера и ошибки:

    public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {
    private Context context;
    private List<Item> itemList;
    private SavedModel savedModel;
    public ContactAdapter(Context context, List<Item> itemList, SavedModel savedModel) {
        this.context = context;
        this.itemList = itemList;
        this.savedModel = savedModel;
    }
    @NonNull
    @Override
    public ContactViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return new ContactViewHolder(LayoutInflater.from(context).inflate(R.layout.item_search_contact, viewGroup, false));
    }
    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull ContactViewHolder contactViewHolder, @SuppressLint("RecyclerView") final int position) {
        contactViewHolder.setIsRecyclable(false);
        contactViewHolder.tvContactName.setText(itemList.get(position).getLastname() + " " + itemList.get(position).getFirstname());
        contactViewHolder.tvContactDescription.setText(itemList.get(position).getPlaceOfWork());
        contactViewHolder.imgSave.setOnClickListener(view -> {
        View view1 = LayoutInflater.from(context).inflate(R.layout.message_dialog, null);
        AlertDialog.Builder dialog = new AlertDialog.Builder(context.getApplicationContext()).setTitle("123").setView(view1);
        dialog.show();
                //= new AlertDialog.Builder(context)
                //.setTitle("Зберегти в обраних?")
               // .setView(view1);
                //.setPositiveButton(R.string.yes, (dialogInterface, i) -> savedModel.addObject(itemList.get(position)))
                //.setNegativeButton(R.string.cancel, (dialogInterface, i) -> Toast.makeText(context, "Додавання відмінено!", Toast.LENGTH_SHORT).show())
                //.show();

    });

        contactViewHolder.imgOpenPdf.setOnClickListener(view -> openPdfByLink(itemList.get(position).getLinkPDF()));
    }
    @Override
    public int getItemCount() {
        return itemList.size();
    }
    private void openPdfByLink(String link){
        Intent intent = new Intent(context, SearchActivity.class);
        intent.putExtra("link", link);
        context.startActivity(intent);
    }
    public class ContactViewHolder extends RecyclerView.ViewHolder{
        private TextView tvContactName, tvContactDescription;
        private ImageView imgOpenPdf, imgSave;
        public ContactViewHolder(@NonNull View itemView) {
            super(itemView);
            tvContactDescription = itemView.findViewById(R.id.tvContactDescription);
            tvContactName = itemView.findViewById(R.id.tvContactName);
            imgOpenPdf = itemView.findViewById(R.id.imvOpenPdf);
            imgSave = itemView.findViewById(R.id.imvAddToLike);
        }
    }
}

Вот код ошибки:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.divinkas.searchcontacts, PID: 4074
    android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:644)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:261)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
        at android.app.Dialog.show(Dialog.java:286)
        at android.app.AlertDialog$Builder.show(AlertDialog.java:951)
        at com.example.divinkas.searchcontacts.Adapter.ContactAdapter.lambda$onBindViewHolder$0(ContactAdapter.java:55)
        at com.example.divinkas.searchcontacts.Adapter.-$$Lambda$ContactAdapter$vWBPDFnY457u-Yc5wbC64H9_gx4.onClick(lambda)
        at android.view.View.performClick(View.java:4463)
        at android.view.View$PerformClick.run(View.java:18770)
        at android.os.Handler.handleCallback(Handler.java:808)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:5292)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
        at dalvik.system.NativeStart.main(Native Method)

Может быть проблемма в том что я использую мокси и адаптер создается в презентере, откуда и берет свой контекст?

Answer 1

Нельзя для AlertDialog использовать контекст приложения

context.getApplicationContext()

Все потому, что для AlertDialog требуется обьект Window контекста для отображения.
Говоря простыми словами, если у контекста нет UI, он не годится.

В вашем случае используйте контекст активити, которая создала адаптер, переменная context как я понимаю.

READ ALSO
Как работает JVM написанная на Java?

Как работает JVM написанная на Java?

Объясните, недалекомуДля запуска Java приложений требуется JVM

209
Как сделать сортировку списка в Android?

Как сделать сортировку списка в Android?

У меня в приложении есть список сообщений (входящие и исходящие) и я хочу их сортировать по возможности по трем параметрам: текст сообщения,...

163
Как правильно обработать на Java входящий JSON?

Как правильно обработать на Java входящий JSON?

Как делать запросы и их обрабатывать - я разобрался

163
Непонятная проблема с выбором элемента spinner Android

Непонятная проблема с выбором элемента spinner Android

Пытаюсь внедрить spinner у себя в приложенииВ списке есть три пункта, и по непонятной мне причине воспринимается выбор только 2,3 если начинать...

206