首页 > 解决方案 > .dismiss 后 Android 对话框未关闭

问题描述

我有一个对话框,它有一个包含多个项目的回收器视图,或者说“家庭”,当我单击其中一个时,我想关闭那个对话框并打开另一个带有来自家庭的“产品”的回收器视图单击并单击最新的其中一种产品后,它应该关闭该对话框并打开最后一个对话框,您可以在其中编辑产品。所以它是这样的:

视图中的按钮->带有回收器的系列对话框-单击项目时的回收器->带有回收器的该系列的产品-单击项目时的回收器->编辑该项目

当我打开家庭对话框时效果很好,然后将其关闭并打开产品之一。但是,当我从“产品”对话框中单击产品时,即使“编辑产品”顺利打开,该对话框也不会被关闭,我使用与单击“家庭”中的项目时相同的方法,并且由于某种原因它仍然不起作用。

我试过:

dialogProducts.dismiss();

dialogProducts.cancel();

对话产品.hide();

dialogProducts.dismiss(); 在一个新线程上

dialogProducts.dismiss(); 在 runOnUiThread

……

这是我的代码的草图:

addButton.setOnClickListener(v -> {


            final Dialog dialogFamilias = new Dialog(getActivity());
             

            //shows families Dialog, lstItemsFamilia is the items in the recycler view
            mostraFamilias(dialogFamilias,lstItemsFamilia);


            RecyclerView recyclerFamilias = dialogFamilias.findViewById(R.id.recyclerAlert);
            

            recyclerFamilias.addOnItemTouchListener(new MyRecycleViewClickListener(getContext(), new MyRecycleViewClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {

                    //this one dismiss works
                    dialogFamilias.dismiss();

                    int idFamiliaClicada = lstItemsFamilia.get(position).getId();


                    final Dialog dialogProducts = new Dialog(getActivity());
                    mostraProdutos(dialogProducts , lstItemsProducts);
                    RecyclerView recyclerProducts = dialogProducts .findViewById(R.id.recyclerAlert);



                    recyclerProducts.addOnItemTouchListener(new MyRecycleViewClickListener(getContext(), new MyRecycleViewClickListener.OnItemClickListener() {
                        @Override
                        public void onItemClick(View view, int position) {
                            
                            // this one doesn't dismiss
                            dialogProducts.dismiss();


                            int idProdutoClicado = lstItemsProducts.get(position).getId();
                            final Dialog dialogSingleProduct = new Dialog(getActivity());
                            
                            //shows the final dialog to edit the product 
                            mostraEditarProduto(dialogSingleProduct, idProdutoClicado);

                        }


                    }));


                    }

            }));


        });

MyRecycleViewClickListener 看起来像这样:(取自 How to click recyclerview items in Activity?

public class MyRecycleViewClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;

    public interface OnItemClickListener {
        public void onItemClick(View view, int position);
    }

    GestureDetector mGestureDetector;

    public MyRecycleViewClickListener(Context context, OnItemClickListener listener) {
        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

显示对话框的方法如下所示:

   public void mostraFamilias (Dialog dialogFamilias, List<ItemModel> lstItemsFamilia){


        dialogFamilias.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialogFamilias.setContentView(R.layout.selecionador);
        dialogFamilias.setCanceledOnTouchOutside(true);



        TextView text = (TextView) dialogFamilias.findViewById(R.id.tituloAlert);

        text.setText("Selecionar Família");

        int width = (int)(getResources().getDisplayMetrics().widthPixels*0.90);
        int height = (int)(getResources().getDisplayMetrics().heightPixels*0.90);

        dialogFamilias.getWindow().setLayout(width, height);



        RecyclerView recyclerFamilias = (RecyclerView) dialogFamilias.findViewById(R.id.recyclerAlert);
        RecyclerViewItemsAdapter adapterFamilias = new 
        RecyclerViewItemsAdapter(getContext(),lstItemsFamilia);

        GridLayoutManager manager = new GridLayoutManager(getContext(),3);
        recyclerFamilias.setLayoutManager(manager);

        recyclerFamilias.addItemDecoration(new SpacesItemDecoration(20));
        recyclerFamilias.getRecycledViewPool().setMaxRecycledViews(0, 0);
        recyclerFamilias.setAdapter(adapterFamilias);

        dialogFamilias.show();


    }

mostraProdutos 方法类似。

标签: javaandroidandroid-studioandroid-recyclerviewdialog

解决方案


将这些线移到外面

final Dialog dialogFamilias = new Dialog(getActivity());
final Dialog dialogProducts = new Dialog(getActivity());
final Dialog dialogSingleProduct = new Dialog(getActivity());
addButton.setOnClickListener(v -> {
    ...
}

推荐阅读