📜  如何在 Android 中实现 On Saved Instance State?

📅  最后修改于: 2022-05-13 01:55:09.249000             🧑  作者: Mango

如何在 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);
    }
}

这是我们应用程序的最终输出。

输出: