防止每次在自定义对话框上膨胀

时间:2012-10-24 18:25:53

标签: android

我搜索并搜索过此内容,但遗憾的是,我没有找到任何有关如何在自定义对话框中重复使用以前虚增的视图的有用信息。

这是我尝试过的(没有一个工作过)

方法1:

将我的alertdialog构建器保持为全局,并onCreate()执行我需要的操作:

private AlertDialog.Builder dialog;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dialog = new AlertDialog.Builder(this);
        detailView = getLayoutInflater().inflate(R.layout.detail, null);
        TextView textview1 = (TextView)detailView.findViewById(R.id.lblName);
        TextView textview2 = (TextView)detailView.findViewById(R.id.lblSubtitle);

        textview1.setText("Test1");
        textview2.setText("Test2");
        dialog.setView(detailView);
        dialog.create();

    btnSearch = (ImageView)findViewById(R.id.btnSearch);
    btnSearch.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            dialog.show();
        }
    });
    }

然后在需要时展示它:dialog.show();

无效,LogCat输出:

Uncaught handler: thread main exiting due to uncaught exception
java.lang.IllegalStateException: The specified child already has a parent. 
You must call removeView() on the child's parent first.

方法2:

onCreate()只需夸大布局和点击事件:

dialog = new AlertDialog.Builder(this);
    TextView textview1 = (TextView)detailView.findViewById(R.id.lblName);
    TextView textview2 = (TextView)detailView.findViewById(R.id.lblSubtitle);
    textview1.setText("Test1");
    textview2.setText("Test2");
    dialog.setView(detailView);
    dialog.create();

但它崩溃了,给出了相同的错误输出。

当然我已经阅读了输出并试图找到父输出,所以我猜测父对象本身就是对话框,但它没有任何删除视图的方法,所以我真的不知道该怎么做做。

还有一种方法可以重用textview引用吗?

(我知道它的编码很差,只是想让它正常工作,我会正确地重构它。

2 个答案:

答案 0 :(得分:1)

取消或取消对话框时,需要删除膨胀的视图。以下代码执行此操作:

dialog.setOnDismissListener(new OnDismissListener() {
  @Override
  public void onDismiss(DialogInterface dialog) {
    try{
      ((FrameLayout)detailView.getParent()).removeView(detailView);
    }catch(Exception e){
      //todo handle the case detailView doesn't have a parent
    }
  }
});

然后,您可以将detailView重新添加到新的Dialog。

答案 1 :(得分:0)

已经解决了:

问题如下:

我试图展示AlertDialog.Builder而不是AlertDialog。当我宣布它为dialog时,我不知道我在想什么。

我刚刚宣布了一个AlertDialog并分配了builder.create()的结果,现在它的工作是有意的,只会膨胀一次。

非常感谢你们,特别是@Laurence Dawson,他的回答让我意识到我的代码错了。