在Button上存储TextView单击onSaveInstanceState

时间:2018-06-15 00:22:59

标签: android textview bundle onsaveinstancestate

我正在尝试保存一个TextView值,该值会在按钮单击时更改并保持存储直到我终止应用程序。 我试图使用onSaveInstanceState和onRestoreInstanceState来保存和恢复,只要应用程序正在运行。它对我不起作用。这是我的代码。

TextView questionText;
Button button ;
String perso1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_settings);
    perso1 = MainActivity.perso;
    questionText = (TextView)findViewById(R.id.perso);
    questionText.setText(perso1));
    getSupportActionBar().setIcon(R.drawable.ic_back_icon);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle(R.string.settings);
   button = (Button) findViewById(R.id.button1);


    button.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            resetConsent();
            questionText.setText("You clicked on the button");

        }
    });
}


@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    String newtext = questionText.getText().toString();
    outState.putString("TEXT", newtext);
}


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onRestoreInstanceState(savedInstanceState);

    questionText.setText(savedInstanceState.getString("TEXT"));
}

当我点击按钮直到我杀死应用程序时,我正在尝试保留textview的新值。我做错了什么?

2 个答案:

答案 0 :(得分:0)

ViewModel就是您所需要的!

<强>为什么

  

string URI = "http://www.testwebsite.com/submit?q=+mydata"; string myParameters = ""; using (WebClient wc = new WebClient()) { wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; HtmlResult = wc.UploadString(URI, myParameters); } 类旨在以生命周期意识的方式存储和管理与UI相关的数据。 ViewModel类允许数据在配置更改(例如屏幕旋转)后继续存在。

它让您的生活更轻松。您无需考虑如何在ViewModel中保存它,但您可以将字符串存储在savedInstanceState(作为ViewModel)中,然后观察它。

使用LiveData,您可以在每次单击按钮时更改值,并在每次更改时观察值。

答案 1 :(得分:0)

您总是可以尝试以不同的方式保存状态。

@Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);
    String newtext = questionText.getText().toString();
    outState.putString("TEXT", newtext);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    //check if there was a previous saved state
    if(savedInstanceState != null){
        //get the value you stored earlier in onSaveInstanceState()
        perso1 = savedInstanceState.getString("TEXT");
    }
    questionText = (TextView)findViewById(R.id.perso);
    questionText.setText(perso1));

    //....
}

但这只是拯救国家的另一种方式。

我想我的错误解释如下。

//你正确地做了 - 看,你在这里设置了questionText

onRestoreInstanceState(Bundle savedInstanceState){
    super.onRestoreInstanceState(savedInstanceState);
    //set the questionText below
    questionText.setText(savedInstanceState.getString("TEXT"));
} 

然后在onCreate()中再次设置questionText。这次是一个不正确的值。

perso1 = MainActivity.perso;//< -- setting perso1 to nothing?
questionText = (TextView)findViewById(R.id.perso);
questionText.setText(perso1));//<-- setting questionText again
  

onRestoreInstanceState

     

在onStart()和onPostCreate(Bundle)之间调用此方法。

在onSaveInstanceState()中你正确地做了,在onRestoreInstanceState()中你做得正确,在onCreate()中你再次将值设置为错误的值。

另外,在决定以这种方式保持状态或使用ViewModel

时,请阅读此内容
  

对于简单数据,活动可以使用onSaveInstanceState()方法并从onCreate()中的包中恢复其数据,但此方法仅适用于可以序列化然后反序列化的少量数据,而不适用于潜在的大数据大量数据,如用户列表或位图。