我正在尝试在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.
答案 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的一部分,我认为它应该被视为属于模型/数据层。