In android, Preserving and restoring an activity’s UI state in a timely fashion across system-initiated activity or application destruction is a crucial part of the user experience. In these cases the user expects the UI state to remain the same, but the system destroys the activity and any state stored in it. The savedInstanceState is a reference to a Bundle object that is passed into the onCreate method of every Android Activity. Activities have the ability, under special circumstances, to restore themselves to a previous state using the data stored in this bundle.
In this article, we will be using an editText, a radio button, and a spinner to take input from users. When the user will rotate the screen in wide mode then the data will be shown using a Toast proving the concept on OnSavedInstanceState. Here is a sample video of what we going to build in this article.
Step By Step Implementation
Step 1: Create a New Project in Android Studio
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. The code for that has been given in both Java and Kotlin Programming Language for Android.
Step 2: Working with the XML Files
Next, go to the activity_main.xml file, which represents the UI of the project. Below is the code for the activity_main.xml file.
XML
<? xml version = "1.0" encoding = "utf-8" ?> android:layout_width = "match_parent" android:layout_height = "match_parent" android:gravity = "center_horizontal" android:orientation = "vertical" android:padding = "16dp" tools:context = ".MainActivity" > < EditText android:id = "@+id/edit_text" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:background = "@android:drawable/editbox_background" android:hint = "Enter text" android:padding = "12dp" /> < RadioGroup android:id = "@+id/radio_group" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_marginTop = "16dp" android:orientation = "horizontal" > < RadioButton android:id = "@+id/rb_true" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:padding = "12dp" android:text = "True" android:textSize = "24sp" /> < RadioButton android:id = "@+id/rb_false" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:padding = "12dp" android:text = "False" android:textSize = "24sp" /> </ RadioGroup > < Spinner android:id = "@+id/spinner" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_marginTop = "16dp" android:padding = "12dp" /> </ LinearLayout > |
Step 3: Working with the MainActivity file
Go to the MainActivity.java file and refer to the following code. Below is the code for the MainActivity.java file. Comments are added inside the code to understand the code in more detail.
Java
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<String> 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); } } |
Kotlin
import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.View import android.widget.* import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { // initialize variables lateinit var editText: EditText lateinit var radioGroup: RadioGroup lateinit var rbTrue: RadioButton lateinit var rbFalse: RadioButton lateinit var spinner: Spinner lateinit var string: String var aBoolean = false var anInt = 0 override fun onCreate(savedInstanceState: Bundle?) { 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 val arrayList = ArrayList<String>() arrayList.add( "Select Position" ) arrayList.add( "1" ) arrayList.add( "2" ) arrayList.add( "3" ) // set adapter spinner.adapter = ArrayAdapter(applicationContext, android.R.layout.simple_spinner_dropdown_item, arrayList) editText.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { // get string value string = s.toString() } override fun afterTextChanged(s: Editable) {} }) radioGroup.setOnCheckedChangeListener { group, checkedId -> // get boolean value aBoolean = checkedId == R.id.rb_true } spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View, position: Int, id: Long) { // get int value anInt = position } override fun onNothingSelected(parent: AdapterView<*>?) {} } } override fun onSaveInstanceState(outState: Bundle) { // 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 fun onRestoreInstanceState(savedInstanceState: Bundle) { // get values from saved state string = savedInstanceState.getString( "string_value" ).toString() aBoolean = savedInstanceState.getBoolean( "boolean_value" ) anInt = savedInstanceState.getInt( "int_value" ) // display toast Toast.makeText(applicationContext, "$string - $aBoolean - $anInt" , Toast.LENGTH_SHORT) .show() super .onRestoreInstanceState(savedInstanceState) } } |