在学习的过程中,我尝试构建一个简单的应用程序,在滚动视图中显示文件夹中的一些图像。
然而,我的应用程序连续第二次点击此项目时崩溃了。 onOptionsItemSelected()中的removeAllViews()确实有助于防止在其间单击其他项目时发生崩溃。
我确实阅读并尝试了很多,没有任何成功。 有人能指出我正确的方向吗?
这是守则。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
LinearLayout myLinearLayout = (LinearLayout) findViewById(R.id.myLinearLayout);
myLinearLayout.removeAllViews(); //Does help if whatever item is clicked in between.
switch (id) {
case R.id.action_whatever:
...
return true;
case R.id.action_showScrollview:
File tumbDir = new File(Environment.getExternalStorageDirectory() + "/tumbs");
File[] allTumbs = tumbDir.listFiles();
for(File tumb : allTumbs){
ImageView myImageView = new ImageView(getApplicationContext());
Bitmap tumbToShow = BitmapFactory.decodeFile(tumb.getAbsolutePath());
myImageView.setImageBitmap(tumbToShow);
myLinearLayout.addView(myImageView); //This line causes crash on second click of the showScrollview item in a row
}
return true;
default:
return super.onOptionsItemSelected(item);
}
编辑:
我现在使用了一种解决方法,以确保在连续第二次调用添加图像的方法之前执行removeAllViews()。
这些行保留在我的选项菜单的onOptionsImtemSelected()中:
LinearLayout myLinearLayout = (LinearLayout) findViewById(R.id.myLinearLayout);
myLinearLayout.removeAllViews();
菜单项中的这些行:
if (clickedTwice) clickedTwice=false;
else clickedTwice = showMyScrollView();
返回值为true的方法:
private boolean showMyScrollView() {
File tumbDir = new File(Environment.getExternalStorageDirectory() + "/tumbs");
File[] allTumbs = tumbDir.listFiles();
for (File tumb : allTumbs){
ImageView myImageView = new ImageView(this);
Bitmap tumbToShow = BitmapFactory.decodeFile(tumb.getAbsolutePath());
myImageView.setImageBitmap(tumbToShow);
myLinearLayout.addView(myImageView);
}
return true;
}
当然,当然每次单击菜单项会导致空白屏幕,导致视图被删除。在第三次点击图像再次添加没有问题。
所以我认为问题是removeAllViews()在处理下面的代码之前没有可靠地执行。 也许和她描述的类似: Calling removeAllViews(); still results in IllegalStateException:You must call removeView() on the child's parent first