Java Android中UI的保存状态

Java Android中UI的保存状态,java,android,Java,Android,我正在制作一个待办事项列表应用程序,在用户按下按钮后,我创建了一个新的GridLayout(以及其中所有关于时间和任务名称的数据),并将其添加到我的RelativeLayout中。我如何在UI中保存这些GridLayouts,以便在活动被销毁并再次启动后,这些布局仍然存在 按下按钮后,我触发创建活动方法 public void CreateActivity(String name,int hours, int minutes,int i) { RelativeLayout.LayoutPara

我正在制作一个待办事项列表应用程序,在用户按下按钮后,我创建了一个新的GridLayout(以及其中所有关于时间和任务名称的数据),并将其添加到我的RelativeLayout中。我如何在UI中保存这些GridLayouts,以便在活动被销毁并再次启动后,这些布局仍然存在

按下按钮后,我触发创建活动方法

public void CreateActivity(String name,int hours, int minutes,int i)
{
 RelativeLayout.LayoutParams relparams= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
    relparams.addRule(RelativeLayout.BELOW,i);
    relparams.setMargins(0,50,0,100);
   Glayouts.add(new GridLayout(this));
    Glayouts.get(i+1).setBackgroundColor(Color.GRAY);
    Glayouts.get(i+1).setMinimumWidth(relative.getWidth());
    Glayouts.get(i+1).setId(i+1);
    Glayouts.get(i+1).setPadding(10,0,0,0);
    GridLayout.LayoutParams namee = new GridLayout.LayoutParams();
    namee.columnSpec = GridLayout.spec(0);
    namee.rowSpec = GridLayout.spec(0);
    namee.setGravity(Gravity.LEFT);
    final TextView Actname = new TextView(this);
    Actname.setText(name);

    GridLayout.LayoutParams checkbox = new GridLayout.LayoutParams();
    checkbox.columnSpec = GridLayout.spec(1);
    checkbox.rowSpec = GridLayout.spec(0);
    checkbox.setGravity(Gravity.RIGHT);
    CheckBox check = new CheckBox(this);
    // ADDING TO LAYOUT
    Glayouts.get(i+1).addView(Actname,namee);
    Glayouts.get(i+1).addView(check,checkbox);

    relative.addView(Glayouts.get(i+1),relparams);

你不能。保存状态的最佳方法是使用一些持久性机制,例如数据库(我推荐使用,因为它是由Google官方支持的)

单击一个按钮后,您应该将所有需要的信息(名称、小时、分钟)放入数据库中,当创建活动时,您可以读取所有持久化的数据,并在此基础上再次创建所有需要的布局


另一个选择是将数据存储在中—设置起来容易得多,所以您也可以从这个解决方案开始。请注意,我建议将其作为Android持久化领域的第一步,而不是作为存储数据的首选解决方案。

理论上,当您扩展视图时,您还可以覆盖
onSaveInstanceState
onRestoreInstanceState
方法,您必须提供自己的
SavedState
类,该类通常
扩展BaseSavedState
。你可以找到这方面的信息

在您的情况下,您的布局是动态的,因此这实际上不起作用。说实话,您的布局可能不应该以这种方式构建,您应该使用基于描述此布局的“模型”的RecyclerView渲染网格,通过
RecyclerView.Adapter
渲染网格项,并且您应该保留“模型”,或者您用于构建此模型的数据以及用户输入的状态,以便您可以重新构建将通过RecyclerView呈现的模型

您可以阅读有关RecyclerView的更多信息

您可以阅读有关数据持久性的更多信息


您可以阅读有关使用
onSaveInstanceState
在配置更改和进程终止(但未完成然后重新启动应用程序)期间将数据保存在活动/片段中的内容。

您可以更清楚地解释它,或者发布任何UI吗。你到底想要实现什么?感谢你的回复,我添加了我的方法,添加了gridlayout。基本上,它会在一个相对的应用程序中创建一个gridlayout,但当我关闭应用程序并再次启动它时,我的相对布局又是空的。如何保存GridLayout,使其在再次启动应用程序后仍然存在?你解释了downvoting吗?视图确实有内置的状态持久性机制,因此“你不能”是一种延伸,即使它在这里不适用(因为以编程方式构建布局)。还因为你说“在SharedReferences中存储数据”,这实际上只是一个“不”字。它可能是一个键值存储,但实际上它只是一个大的XML文件。OP要求提供一种保持状态的机制,即使在再次启动应用程序之后也是如此(在评论中对此进行了解释)。内置视图状态持久化状态不提供此类功能。2.我也确信Room(或Realm或其他解决方案)比真正的应用程序的
SharedReferences
要好得多(我甚至在回答中推荐了它),hovewer IMO,对于初学者来说,这是一个非常好的解决方案,也是最容易开始的解决方案。你的观点可能会有所不同,但我看不到否决投票的理由。@EpicPandaForce根据你的评论,我编辑了我的回答,以澄清
SharedReferences
不是目标解决方案。嗯,我最初认为他的意思是当你把应用程序放到后台(进程终止)然后回来。哪些视图可以处理。但我想这是一个延伸:D你修改后的答案更好,所以我撤销了它