如何防止自定義檢視在螢幕方向改變時丟失狀態?


簡介

在 Android 應用中,我們經常會遇到使用者更改裝置螢幕方向的情況,例如從縱向切換到橫向。在這種情況下,我們可能會發現應用中的一些檢視會丟失其狀態。例如,當用戶在文字框中輸入一些資料,然後更改螢幕方向時,之前輸入的資料可能會被清除。為了防止這種情況發生,我們需要儲存該檢視的狀態。本文將探討如何在 Android 中防止自定義檢視在螢幕方向改變時丟失狀態。

實現

我們將建立一個簡單的應用程式,其中顯示一個 TextView 用於顯示應用程式標題。然後,我們將建立一個 EditText 供使用者輸入資料,以及一個 Button 用於顯示 Toast 訊息。現在,我們將使用 Android Studio 建立一個新的專案。

步驟 1:在 Android Studio 中建立新專案

導航到 Android Studio,如下面的螢幕所示。在下面的螢幕中,點選“新建專案”以建立一個新的 Android Studio 專案。

點選“新建專案”後,您將看到下面的螢幕。

在此螢幕中,我們只需選擇“空活動”,然後點選“下一步”。點選“下一步”後,您將看到下面的螢幕。

在此螢幕中,我們只需指定專案名稱。然後包名將自動生成。

注意:確保選擇語言為 Java。

指定所有詳細資訊後,點選“完成”以建立一個新的 Android Studio 專案。

專案建立完成後,我們將看到兩個開啟的檔案:activity_main.xml 和 MainActivity.java 檔案。

步驟 2:使用 activity_main.xml

導航到 activity_main.xml。如果此檔案不可見,則要開啟此檔案,在左側窗格中導航到 app > res > layout > activity_main.xml 以開啟此檔案。開啟此檔案後,將以下程式碼新增到其中。程式碼中添加了註釋,以便詳細瞭解。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context=".MainActivity">
   <!-- on below line creating a text view for heading -->
   <TextView
       android:id="@+id/idTVHeading"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:layout_margin="10dp"
       android:padding="4dp"
       android:text="Prevent Custom Views from loosing state across screen orientation changes in Android"
       android:textAlignment="center"
       android:textColor="@color/black"
       android:textSize="18sp"
       android:textStyle="bold" />
   <!-- on below line creating a text view for displaying a response message -->
   <EditText
       android:id="@+id/idEdtMsg"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_below="@id/idTVHeading"
       android:layout_margin="10dp"
       android:hint="Enter your name" />
   <!-- on below line creating a button -->
   <Button
       android:id="@+id/idBtnDisplayToast"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_below="@id/idEdtMsg"
       android:layout_margin="10dp"
       android:text="Display Toast Message"
       android:textAllCaps="false" />
</RelativeLayout>

說明:在上面的程式碼中,我們建立了一個根佈局作為相對佈局。在此佈局內,我們建立了一個 TextView 用於顯示應用程式標題。然後,我們建立了一個 EditText,使用者可以在其中新增其姓名以在 Toast 訊息中顯示。然後,我們建立了一個 Button 用於顯示 Toast 訊息。最後,我們添加了相對佈局的結束標籤。

步驟 3:使用 MainActivity.java 檔案

導航到 MainActivity.java。如果此檔案不可見,則要開啟此檔案,在左側窗格中導航到 app > res > layout > MainActivity.java 以開啟此檔案。開啟此檔案後,將以下程式碼新增到其中。程式碼中添加了註釋,以便詳細瞭解。

package com.example.java_test_application;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
   // creating variables for text view on below line.
   private EditText msgEdt;
   private Button displayToastBtn;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       //initializing variable for text view and button on below line.
       msgEdt = findViewById(R.id.idEdtMsg);
       displayToastBtn = findViewById(R.id.idBtnDisplayToast);
       // on below line checking if the saved state is not null.
       if (savedInstanceState != null) {
           // on below line setting the data from the saved state to our edit text.
           msgEdt.setText(savedInstanceState.getString("message"));
       }
       // on below line adding click listner for our button.
       displayToastBtn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               // on below line displaying a toast message.
               Toast.makeText(MainActivity.this, "Hello " + msgEdt.getText().toString(), Toast.LENGTH_SHORT).show();
           }
       });
   }
   // on below line creating a method to saved the instance state.
   @Override
   public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
       super.onSaveInstanceState(outState, outPersistentState);
       // on below line setting outstate to set put the data.
       outState.putString("message", msgEdt.getText().toString());
   }
}

說明:在上面的程式碼中,首先我們為 EditText 和 Button 建立變數。現在,我們將看到 onCreate 方法。這是每個 Android 應用程式的預設方法。此方法在建立應用程式檢視時呼叫。在此方法中,我們設定內容檢視,即名為 activity_main.xml 的佈局檔案,以從該檔案中設定 UI。在 onCreate 方法中,我們使用我們在 activity_main.xml 檔案中給定的 ID 初始化 EditText 和 Button 變數。

然後,我們檢查儲存的例項狀態是否不為 null。如果它不為 null,那麼我們獲取儲存在儲存的例項狀態中的資料,並將該資料設定為我們的 EditText。然後,我們為 Button 新增一個 onclick 監聽器。在 onclick 方法中,我們使用 EditText 中的資料顯示一個 Toast 訊息。然後,我們建立一個名為 onSaveInstanceState 的方法。在此方法中,我們透過使用名為“message”的鍵設定 EditText 中的資料來儲存 EditText 的狀態。我們將在 onCreate 方法中使用相同的鍵讀取資料。

新增上述程式碼後,我們只需點選頂部的綠色圖示即可在移動裝置上執行我們的應用程式。

注意:確保已連線到您的真實裝置或模擬器。

輸出

結論

在本文中,我們探討了如何在 Android 中防止自定義檢視在螢幕方向改變時丟失狀態。

更新於: 2023年5月9日

381 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.