【问题标题】:Saving Entire Activity State保存整个活动状态
【发布时间】:2015-04-27 03:35:32
【问题描述】:

我有一个 Android 应用程序,它允许用户将自己的按钮动态添加到布局中。我需要这样做,以便一旦应用程序关闭并重新打开,这个动态添加的按钮就会返回到布局。而不是加载默认布局。

目前我是通过App的ActionBar动态添加按钮:

    if (id == R.id.add_button) 
        {
        String string = "Adding Button in Progress";
        Toast.makeText(getApplicationContext(), string, Toast.LENGTH_SHORT).show( );

        Button myButton = new Button(this);
        myButton.setText("Button");

        RelativeLayout layout = (RelativeLayout)findViewById(R.id.Layout1);
        layout.addView(myButton);

        //myButton.setVisibility(View.VISIBLE);
        return true;    
        }

这可以很好地创建按钮,但是当应用程序关闭并重新打开时,它会启动默认布局。

我对让应用保存并重新加载更新后的布局进行了一些研究。看来我需要使用onSaveInstanceState。以下是我迄今为止尝试保存布局的内容:

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the app state here:
    savedInstanceState.putAll(savedInstanceState);

    super.onSaveInstanceState(savedInstanceState);
    }

这就是我在尝试“重新加载/恢复”所述布局方面所拥有的。请注意,我没有使用 onRestoreInstanceState,而是通过 onCreate 方法进行操作:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);


    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        //savedInstanceState.get(savedInstanceState);
        } 

    else 
        {
        //initialize members with default values for a new instance
        setContentView(R.layout.activity_main);
        }
    }

我不确定我的保存/加载是否正确,但我将不胜感激有关如何完成此任务的任何建议。

感谢您的宝贵时间!

附:我仍然是一个相当新的成员,所以我无法对现有线程发表评论/提问。

我知道有很多关于尝试加载/保存布局的信息,但在我的情况下,我需要它来保存按钮,而不是用户文本字符串。换句话说,它不是我需要保存的固定值。如果用户添加了 n 个按钮,当应用程序退出并重新启动时,它应该具有相同的 3 个按钮。

【问题讨论】:

  • 结合 ViewStub 和 SharedPreferences 将解决您的问题。
  • @VVB:感谢您的回复。我之前尝试过查看 SharedPreferences 但被拒绝了,因为我不确定如何将活动的状态(即最近添加的按钮)表示为 SharedPreferences 似乎需要的键值对。

标签: android android-layout android-activity savestate


【解决方案1】:

Saved Instance State 是关于您的活动的键值对。文档清楚地表明,当应用程序关闭时它会被销毁。(按下后退按钮或系统本身关闭应用程序)。这仅在您在应用程序内导航或更改方向时有用。

一种解决方案是创建应用程序所需详细信息的共享首选项,以识别包含动态内容的给定结构。每当您打开应用程序并根据它编写代码时获取值。

其他解决方案是使用数据库或文件来存储有关您的动态内容的数据。

【讨论】:

  • 关于共享首选项方法,我似乎无法理解的一件事是如何将新添加的按钮表示为键值对。
  • 您可以使用诸如 putBoolean 和 putInt 之类的方法,它们使用键值对来存储值。但据我所知,没有办法将按钮表示为字符串、布尔值、整数等?
  • 不要将整个按钮存储为共享首选项。保存其属性或属性,然后使用给定数据呈现按钮。
【解决方案2】:

只需存储字符串或布尔值。当您尝试在 onRestoreInstanceState 中使用它们时,然后动态创建 Button 或任何东西,并使用存储的字符串或布尔值在它们上设置文本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2014-02-24
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多