第七課:運用SharePreferences

今課要教大家的是如何可以把資料(Data)儲存起來,待下一次開啟App時可以再提取使用,並根據所儲存的資料,有不同的回應。

我們會用回上一課的打招呼App,作少許改動,讓它可以把輸入的名字儲存,在下一次開App時可以把名字直接顯示出來,而不需用家再次輸入名字。

首先,我們當然需要把MainActivity的OnClickListener修改一下,讓其可以把所輸入的名字儲起。

[code lang=”java”]
@Override
public void onClick(View v) {
String name = etName.getText().toString();

SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString(SecondActivity.KEY_NAME, name);
editor.commit();

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
[/code]

SharePreferences就是用來把Data儲起的地方,”data”就是這個Preferences的key,而MODE_PRIVATE就是標示這個Preferences只有自己的App可以存取,還有其他的選擇可以參考Google Android的Documentation。

之後我們需要一個Editor去把SharePreferences的數值改變,記得最後要加上commit,這樣所改變的數值才會生效。

然後我們需要修改SecondActivity,讓其可以讀取在SharePreferences的數值,修改如下:

[code lang=”java”]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);
String name = preferences.getString(KEY_NAME, "default");

tvWelcome = (TextView) findViewById(R.id.textView_welcome);
tvWelcome.setText("Hello, " + name);
}
[/code]

在這裡我們要留意的是,在getString時我們需要提交一個預設的數值,讓SharePreferences找不到數值時以此作數值提交,換個說法,若沒有KEY_NAME時,name會等於default。

最後我們要回到MainActivity,在OnCreate作出修改,讓其可以在Activity開始前嘗試讀取數值,並決定要開始那一個Activity,修改後的MainActivity如下:

[code lang=”java”]
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

private TextView tvGreeting;
private EditText etName;
private Button bnOk;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);

String name = preferences.getString(SecondActivity.KEY_NAME, "default");

if (!name.equals("default")) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
finish();
return;
}

setContentView(R.layout.activity_main);

tvGreeting = (TextView) findViewById(R.id.textView_greeting);
etName = (EditText) findViewById(R.id.editText_name);
bnOk = (Button) findViewById(R.id.button_ok);

bnOk.setOnClickListener(this);
}

@Override
public void onClick(View v) {
String name = etName.getText().toString();

SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString(SecondActivity.KEY_NAME, name);
editor.commit();

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}

}
[/code]

發表回覆