第二次调用addview

时间:2015-12-17 20:20:10

标签: java android imageview scrollview

在学习的过程中,我尝试构建一个简单的应用程序,在滚动视图中显示文件夹中的一些图像。

然而,我的应用程序连续第二次点击此项目时崩溃了。 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

0 个答案:

没有答案