android AlertDialog关闭后,活动的LinearLayout未更新

ha5z0ras  于 2023-01-19  发布在  Android
关注(0)|答案(1)|浏览(157)

使用以下代码,我可以在长时间单击按钮时成功地从LinearLayout中删除视图:

button.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                linearlayout.removeView(view);
                return false;
            }
        });

活动会立即更新。
然而,当我尝试通过AlertDialog的否定按钮来实现同样的事情(从相同的LinearLayout中删除相同的视图)时,它只在我关闭应用时(基本上是在Activity重新启动时)才起作用。我不知道为什么它不立即更新Activity。
代码:

.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        System.out.println("test");
                        ll.removeView(view);
                        //ll.invalidate();
                        //dialog.dismiss();
                        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                            @Override
                            public void run() {
                              //stuff
                            }
                        }, 1000);
                    }
                });
kpbwa7wx

kpbwa7wx1#

使用setNegativeButton()方法为AlertDialog创建按钮时,onClick()方法中的代码将在后台线程上执行,而不是在主UI线程上执行。由于从LinearLayout中删除视图是一项UI操作,因此必须在主线程上执行。
解决此问题的一种方法是使用runOnUiThread()方法运行在主线程上删除视图的代码。这可以通过在onClick()方法内调用runOnUiThread(new Runnable() {...})来完成。
解决此问题的另一种方法是使用new Handler(Looper.getMainLooper()).post()方法在主线程上运行删除View的代码。
您也可以在LinearLayout上使用invalidate()方法在删除视图后重新绘制布局,这将有助于立即更新布局。
您还可以使用dialog.dismiss()在删除视图后关闭对话框。
下面是如何使用runOnUiThread()即时更新Activity的示例:

.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        System.out.println("test");
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                ll.removeView(view);
                                ll.invalidate();
                                dialog.dismiss();
                            }
                        });
                    }
                });

或者,可以使用new Handler(Looper.getMainLooper()).post()方法代替runOnUiThread()方法

.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        System.out.println("test");
                        new Handler(Looper.getMainLooper()).post(new Runnable() {
                            @Override
                            public void run() {
                                ll.removeView(view);
                                ll.invalidate();
                                dialog.dismiss();
                            }
                        });
                    }
                });

使用这两种解决方案中的任何一种,Activity都应该在单击按钮时立即更新,而不是仅在应用关闭并重新启动后才更新。

相关问题