重新使用警报对话框视图而不破坏其内容

时间:2016-11-15 14:37:55

标签: android alertdialog

我正在尝试在Android中使用警报对话框,而不会破坏视图及其内容或状态。

例如,我正在使用包含一些编辑文本字段的视图来膨胀对话框。我想在这些字段中输入值,然后隐藏警报对话框,然后再次显示警告对话框,所有值仍处于相同状态。

我的应用程序需要用户输入关于视图内容的注释(使用警告对话框),然后返回主视图,继续工作和阅读,然后添加更多注释。我知道我可以将这些值保存到变量或sqlite3数据库中,但是,当我可以保持视图而不破坏它时感觉就像这样一种解决方法,当我再次打开对话时,它不会再次膨胀视图并重新创建再次查看,替换旧视图。

我尝试了以下内容:

//Class variables

private AlertDialog.Builder builderSave = null;
private LayoutInflater inflater = null;
private View layout = null;

//In my code where I create the dialog ...

try {
    if (builderSave == null) {
        //inflate view for layout for the first time.
        inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
        layout = inflater.inflate(R.layout.dialog_id_form, (ViewGroup) findViewById(R.id.layout_root));
        builderSave = new AlertDialog.Builder(mContext);
        builderSave.setView(layout);
    } else {
        //niks
    }
} catch (Exception e) {
    //daar was n nullpointer exception...
}

但是,在尝试显示第二次对话框时出错:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

1 个答案:

答案 0 :(得分:0)

但是保存之间的数据确实不是一种解决方法......它更像是标准行为。您尝试做的事实上听起来像Android处理视图的方式,可能会导致内存泄漏。

我可以建议您的问题主要在于您的应用架构吗?也许您可以提供更多代码以使您的架构更清晰,或者为什么您会发现难以在显示对话框之间存储数据。

在我的头脑中,使用MVVM方法,我建议这样的事情:

public class SomeViewModel {

    private String myComment;

    public String getMyComment() {
        return myComment;
    }

    public void saveMyComment(String myComment) {
        this.myComment = myComment;
    }

    // All other viewModel stuff
}

对于观点:

public class SomeView extends Fragment {

     private Dialog myDialog;
     private SomeViewModel viewModel;

     /* All the Fragment setup
       * ...
       * ...
       */

     private void initDialog() {
         /* Init Dialog relevant stuff
           * ...
           * ...
           */

         myDialog.setOnDismissListener(new OnDismissListener() {

             @Override
             public void onDismiss(DialogInterface Dialog) {
                 final String newComment = "get comment from Dialog text field";
                 viewModel.saveMyComment(newComment);
             }
         }
     }

     private void showDialog() {
         final String previousComment = viewModel.getMyComment();
         if(previousComment != null) {
             // Set as content on dialogs EditText
         }
         myDialog.show();
     }
}

我认为你的问题是,在概念上你看到EditText内容是视图层/ viewState的一部分,我认为它应该被视为属于模型/数据层。