如何在 Android 中实现 On Saved Instance State?
在 android 中,在系统启动的 Activity 或应用程序销毁中及时保存和恢复 Activity 的 UI 状态是用户体验的关键部分。在这些情况下,用户希望 UI 状态保持不变,但系统会破坏活动和存储在其中的任何状态。 savedInstanceState 是对传递到每个 Android Activity 的 onCreate 方法的 Bundle 对象的引用。在特殊情况下,活动能够使用存储在此捆绑包中的数据将自身恢复到以前的状态。
我们将在本文中构建什么?
在本文中,我们将使用 editText、单选按钮和微调器来获取用户的输入。当用户以宽屏模式旋转屏幕时,将使用 Toast 显示数据,证明 OnSavedInstanceState 上的概念。这是我们将在本文中构建的示例视频。请注意,我们将使用Java语言来实现这个应用程序。
分步实施
步骤 1:创建一个新项目
- 打开一个新项目。
- 我们将使用Java语言开发 Empty Activity。保持所有其他选项不变。
- 您可以在方便时更改项目的名称。
- 将有两个名为 activity_main.xml 和 MainActivity 的默认文件。Java
如果您不知道如何在 Android Studio 中创建新项目,可以参考如何在 Android Studio 中创建/启动新项目?
第 2 步:使用 activity_main.xml 文件
导航到 app > res > layout > activity_main.xml 并将以下代码添加到该文件。下面是 activity_main.xml 文件的代码。
XML
Java
package com.example.savedinstancestate;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
// initialize variables
EditText editText;
RadioGroup radioGroup;
RadioButton rbTrue,rbFalse;
Spinner spinner;
String string;
boolean aBoolean;
int anInt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// assign variables
editText=findViewById(R.id.edit_text);
radioGroup=findViewById(R.id.radio_group);
rbTrue=findViewById(R.id.rb_true);
rbFalse=findViewById(R.id.rb_false);
spinner=findViewById(R.id.spinner);
// initialize array list
ArrayList arrayList= new ArrayList<>();
arrayList.add("Select Position");
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
// set adapter
spinner.setAdapter(new ArrayAdapter<>(getApplicationContext()
, android.R.layout.simple_spinner_dropdown_item,arrayList
));
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// get string value
string=String.valueOf(s);
}
@Override
public void afterTextChanged(Editable s) {
}
});
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// get boolean value
aBoolean=checkedId==R.id.rb_true;
}
});
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
// get int value
anInt=position;
}
@Override
public void onNothingSelected(AdapterView> parent) {
}
});
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
// put string value
outState.putString("string_value",string);
// put boolean value
outState.putBoolean("boolean_value",aBoolean);
// Put int value
outState.putInt("int_value",anInt);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
// get values from saved state
string=savedInstanceState.getString("string_value");
aBoolean=savedInstanceState.getBoolean("boolean_value");
anInt=savedInstanceState.getInt("int_value");
// display toast
Toast.makeText(getApplicationContext(),string+" - "+ aBoolean+" - "+anInt,Toast.LENGTH_SHORT).show();
super.onRestoreInstanceState(savedInstanceState);
}
}
执行上述代码后,activity_main.xml 文件的设计如下所示。
第 3 步:使用 MainActivity。Java
转到 MainActivity。 Java文件并参考以下代码。下面是 MainActivity 的代码。 Java文件。代码中添加了注释以更详细地理解代码。
Java
package com.example.savedinstancestate;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
// initialize variables
EditText editText;
RadioGroup radioGroup;
RadioButton rbTrue,rbFalse;
Spinner spinner;
String string;
boolean aBoolean;
int anInt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// assign variables
editText=findViewById(R.id.edit_text);
radioGroup=findViewById(R.id.radio_group);
rbTrue=findViewById(R.id.rb_true);
rbFalse=findViewById(R.id.rb_false);
spinner=findViewById(R.id.spinner);
// initialize array list
ArrayList arrayList= new ArrayList<>();
arrayList.add("Select Position");
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
// set adapter
spinner.setAdapter(new ArrayAdapter<>(getApplicationContext()
, android.R.layout.simple_spinner_dropdown_item,arrayList
));
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// get string value
string=String.valueOf(s);
}
@Override
public void afterTextChanged(Editable s) {
}
});
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// get boolean value
aBoolean=checkedId==R.id.rb_true;
}
});
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
// get int value
anInt=position;
}
@Override
public void onNothingSelected(AdapterView> parent) {
}
});
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
// put string value
outState.putString("string_value",string);
// put boolean value
outState.putBoolean("boolean_value",aBoolean);
// Put int value
outState.putInt("int_value",anInt);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
// get values from saved state
string=savedInstanceState.getString("string_value");
aBoolean=savedInstanceState.getBoolean("boolean_value");
anInt=savedInstanceState.getInt("int_value");
// display toast
Toast.makeText(getApplicationContext(),string+" - "+ aBoolean+" - "+anInt,Toast.LENGTH_SHORT).show();
super.onRestoreInstanceState(savedInstanceState);
}
}
这是我们应用程序的最终输出。
输出: