2015-04-27 54 views
0

我有一个Android应用程序,允许用户动态地将自己的按钮添加到布局。我需要做到这一点,一旦应用程序关闭并重新打开,这个动态添加的按钮将返回到布局。而不是加载默认布局。保存整个活动状态

目前,我在动态通过应用程序的动作条添加按钮:

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); 
     } 
    } 

我不知道如果我保存/加载正确的,但我怎么能完成这一任务的任何建议将不胜感激。

谢谢你的时间!

P.S.我仍然是一个相当新的成员,所以我不能在现有的线程上发表评论/提出问题。

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

+0

ViewStub和SharedPreferences的组合将解决您的问题。 – VVB

+0

@VVB: \t 感谢您的回复。我之前尝试过查看SharedPreferences,但由于我不确定如何将活动状态(即最近添加的按钮)表示为SharedPreferences似乎需要的键值对,而被拒绝。 – organizedchaos

回答

0

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

一种解决方案是创建一个共享首选项,让您的应用程序需要识别由动态内容组成的给定结构。每当您根据它打开应用程序和代码时获取这些值。

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

+0

我似乎无法理解共享首选方法的一件事是如何将新添加的Button表示为键值对。 – organizedchaos

+0

就像你可以使用的方法一样,比如putBoolean和putInt,它们使用key-val对存储值。但据我所知,没有办法将Button表示为String,Boolean,Integer等? – organizedchaos

+0

不要将整个按钮存储为共享的preference.save属性或属性,然后使用给定的数据呈现按钮。 –