java - .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 方法类似。
解决方案
将这些线移到外面
final Dialog dialogFamilias = new Dialog(getActivity());
final Dialog dialogProducts = new Dialog(getActivity());
final Dialog dialogSingleProduct = new Dialog(getActivity());
addButton.setOnClickListener(v -> {
...
}
推荐阅读
- html - 为什么背景变黑但文本仍然是紫色(HTML CSS)?
- elasticsearch - curator-cli 和 curator 动作文件之间的区别
- python - DDS Openslice:如何在 python 中创建监听器
- javascript - 如何将多个单选按钮值作为参数传递?
- java - 使用Java比较2个字符数组中的字符
- javascript - 为什么我的 react 应用在 html 的正文中没有出现脚本标签?
- java - 如何防止用户访问android中应用程序的专用目录
- javascript - 连续禁用数组中的所有复选框
- r - 从 1970 年开始,R 中的情节改变 x 轴
- sql - CONCAT 在 case 语句中以 0 开头