iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0

今天我們來學習做SharedPreferences,SharedPreferences它是一種資料存儲方式,且每個APP的SharedPreferences是各自獨立的,如果APP解除安裝資料也一併刪除。

SharedPreferences常用來儲存簡輕量的資料,如:使用者帳號、名稱等。

大概了解SharedPreferences後,我們來進入實作範例更清楚~


SharedPreferences

介面

  • 介面這次使用一個TextView(可有可無)、一個EditText和兩個Button,下方為我用的畫面供大家參考
    https://ithelp.ithome.com.tw/upload/images/20241005/20168454KO9eHAzkzK.png

(完整程式碼)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/main_theme_tv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.05"
        android:background="#DFA7A7"
        android:gravity="center"
        android:text="SharedPreferences範例"
        android:textSize="24sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.05"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.05"
        android:orientation="horizontal">

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.02"/>

        <EditText
            android:id="@+id/main_msg_et"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.1"
            android:ems="10"
            android:inputType="text"
            android:hint="輸入" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.02"/>

    </LinearLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.05"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="0.05">

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.05"/>

        <Button
            android:id="@+id/main_getMsg_btn"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.1"
            android:textSize="20dp"
            android:text="拿取" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.05"/>

        <Button
            android:id="@+id/main_setMsg_btn"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.1"
            android:textSize="20dp"
            android:text="存取" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.05"/>

    </LinearLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.1"/>

</LinearLayout>

新增 Java Class

  • 這次還要新增一個Java Class,對自己的com.example.檔案 右鍵 > New > 點擊 Java Class
    https://ithelp.ithome.com.tw/upload/images/20241005/20168454xCUKoiuRrF.png

  • 命名完成
    https://ithelp.ithome.com.tw/upload/images/20241005/2016845442mcC2V5GS.png

Sp

(完整程式碼)

public class Sp {
    private static String Msg = "msg";
    private SharedPreferences spf;
    private Context context;

    public Sp(Context context){
        this.context = context;

        spf = this.context.getSharedPreferences((context.getResources().getString(R.string.app_name)),Context.MODE_PRIVATE);

    }

    //放入的方法,前面的"Msg"為Key。
    public void setmsg(String msg){
        spf.edit().putString(Msg,msg).apply();
    }

    //拿取的方法,前面的"Msg"為Key。
    public String getmsg(){
        return spf.getString(Msg,"");
    }
}

  1. spf的動作 => 設定SharedPreferences的模式。設定為只有自己(app_name)才可以讀寫
  2. getSharedPreferences() => 如果想分開存放多個檔案資料的話,這個方法可以指定要存放的檔案名稱
  3. getPreferences() => 這個方式只能存放於你建立在的Activity之下
程式碼 說明
MODE_PRIVATE 只允許該APP存取
MODE_WORLD_READABLE 所有APP都能讀取
MODE_WORLD_WRITEABLE 所有APP都能存取、寫入
MODE_MULTI_PROCESS 允許多個process 同時存取

MainActivity

將於EditText輸入的文字按下按鈕後,轉成String進行存取,之後再按下按鈕於Sp中拿取之前存取的文字。

(完整程式碼)

public class MainActivity extends AppCompatActivity {
    //宣告
    private EditText nameEditText;
    private Button setButton;
    private Button getButton;
    private Sp sp;
    private Context context=this;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        //綁定
        nameEditText = findViewById(R.id.main_msg_et);
        setButton = findViewById(R.id.main_setMsg_btn);
        getButton = findViewById(R.id.main_getMsg_btn);

        sp = new Sp(this);

        getButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                nameEditText.setText(sp.getmsg());
                Toast.makeText(context,"已拿取",Toast.LENGTH_SHORT).show();
            }
        });

        setButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sp.setmsg(String.valueOf(nameEditText.getText().toString()));
                nameEditText.setText("");
                Toast.makeText(context,"已存取",Toast.LENGTH_SHORT).show();
            }
        });
    }
}

執行畫面

(剛開始)
https://ithelp.ithome.com.tw/upload/images/20241005/20168454eTWmqA20Bj.png

(輸入文字點擊存取)
https://ithelp.ithome.com.tw/upload/images/20241005/20168454JiZQQ23Ci3.png

(點擊按鈕拿取文字)
https://ithelp.ithome.com.tw/upload/images/20241005/20168454oBpyyRA7zn.png
成功拿取到文字~
如果關閉APP也是可以拿到之前存取的文字喔!


上一篇
Linearlayout線性佈局 Day26
下一篇
最後的APP(上篇) Day28
系列文
Android 元件總動員 - 運用與實踐元件指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言