使用以下代码,我可以在长时间单击按钮时成功地从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);
}
});
1条答案
按热度按时间kpbwa7wx1#
使用
setNegativeButton()
方法为AlertDialog创建按钮时,onClick()
方法中的代码将在后台线程上执行,而不是在主UI线程上执行。由于从LinearLayout中删除视图是一项UI操作,因此必须在主线程上执行。解决此问题的一种方法是使用
runOnUiThread()
方法运行在主线程上删除视图的代码。这可以通过在onClick()
方法内调用runOnUiThread(new Runnable() {...})
来完成。解决此问题的另一种方法是使用
new Handler(Looper.getMainLooper()).post()
方法在主线程上运行删除View的代码。您也可以在LinearLayout上使用
invalidate()
方法在删除视图后重新绘制布局,这将有助于立即更新布局。您还可以使用
dialog.dismiss()
在删除视图后关闭对话框。下面是如何使用
runOnUiThread()
即时更新Activity的示例:或者,可以使用
new Handler(Looper.getMainLooper()).post()
方法代替runOnUiThread()
方法使用这两种解决方案中的任何一种,Activity都应该在单击按钮时立即更新,而不是仅在应用关闭并重新启动后才更新。