[英]Save activity state with SharedPreferences
我正在編寫一個必須保存活動狀態的應用程序。 我在活動中有一個問題和一些按鈕。 當用戶單擊正確答案時,會同時發生更多事件。
1.電話振動。
2.出現圖像視圖。
3.按鈕被禁用。
我想保存imageview和按鈕狀態,但是當我單擊“后退”按鈕並再次打開活動時,一切都消失了,我必須從頭開始。 我正在使用SharedPrefernces保存它們,但是它不起作用。 我創建了一個布爾類型,其開頭是false。 當用戶選擇正確的答案時,布爾值變為true,如果為true,則事件發生。 我將這種真實狀態保存在onStop方法中,並使用Toast向我展示布爾狀態。 當我選擇正確的答案時,Toast將顯示“ true”,而當我再次打開活動時,它將顯示“ false”。 顯然,嘗試保存“ true”狀態是不好的,但是我是否使用正確的存儲類型來保存imageview和按鈕狀態? 所以我正在努力的事情是使用SharedPreferences保存狀態。
如果有人知道如何操作,請回復! :)
我復制我的代碼:
private static final String KEYFIRST = "KEYFIRST";
private static final String DB_INIT = "DB_INIT";
String requested_word = "gol";
final Button buttons[] = new Button[3];
final Button betu[] = new Button[3];
final String[] letters = new String[3];
final int[] arr = new int[3];
boolean done = false;
ImageView imageview2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("TEST2", "CREATE3");
}
@Override
protected void onStart() {
super.onStart();
Log.d("TEST2", "STRAT3");
SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE);
Boolean state = sp.getBoolean(KEYFIRST, done);
Toast.makeText(getApplicationContext(), ""+done, Toast.LENGTH_LONG).show();
}
@Override
protected void onResume() {
buttons[0] = (Button) findViewById(R.id.valaszelso);
buttons[1] = (Button) findViewById(R.id.valaszmasodik);
buttons[2] = (Button) findViewById(R.id.valaszharmadik);
betu[0] = (Button) findViewById(R.id.elso);
betu[1] = (Button) findViewById(R.id.masodik);
betu[2] = (Button) findViewById(R.id.harmadik);
letters[0] = betu[0].getText().toString();
letters[1] = betu[1].getText().toString();
letters[2] = betu[2].getText().toString();
imageview2 = (ImageView) findViewById(R.id.imageview2);
for (int i = 0; i < 3; i++) {
arr[i] = 0;
}
betu[0].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < 3; i++) {
if (arr[i] == 0) {
arr[i] = 1;
buttons[i].setText(betu[0].getText().toString());
betu[0].setVisibility(View.INVISIBLE);
break;
}
}
}
});
betu[1].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < 3; i++) {
if (arr[i] == 0) {
arr[i] = 1;
buttons[i].setText(betu[1].getText().toString());
betu[1].setVisibility(View.INVISIBLE);
break;
}
}
}
});
betu[2].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < 3; i++) {
if (arr[i] == 0) {
arr[i] = 1;
buttons[i].setText(betu[2].getText().toString());
betu[2].setVisibility(View.INVISIBLE);
break;
}
if (arr[3 - 1] == 1) {
test();
}
}
}
private void test() {
String word = "";
for (int i = 0; i < 3; i++) {
word += buttons[i].getText().toString();
}
if (word.equals(requested_word)) {
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(500);
done = true;
Log.d("TEST2","set true");
if(done == true){
for (int j = 0; j < 3; j++) {
buttons[j].setEnabled(false);
betu[j].setEnabled(false);
imageview2.setVisibility(View.VISIBLE);
}
Toast.makeText(getApplicationContext(), ""+done, Toast.LENGTH_LONG).show();
}
}
}
});
super.onResume();
Log.d("TEST2", "RESUME3");
}
@Override
protected void onStop() {
super.onStop();
SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE);
Editor et = sp.edit();
et.putBoolean(KEYFIRST, done);
et.commit();
if(done == true){
Log.d("TEST2","true saved");
}
Log.d("TEST2", "STOP3");
}
}
當您按下返回按鈕時,它執行的默認操作是完成您的活動。
因此,如果您使用的是sharedPreferences(我個人更喜歡使用SqliteDB)。
您的問題可能是因為您沒有指定您的復制上下文,所以我建議您更改以下行:
SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE);
Editor et = sp.edit();
et.putBoolean(KEYFIRST, done);
et.commit();
對此:
SharedPreferences sp=getApplicationContext().getSharedPreferences(DB_INIT, Context.MODE_PRIVATE);
SharedPreferences.Editor edit=sp.edit();
edit.putBoolean(KEYFIRST, done);
edit.commit();
這行:
SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE);
Boolean state = sp.getBoolean(KEYFIRST, done);
對此:
SharedPreferences shared = getApplicationContext().getSharedPreferences(DB_INIT, Context.MODE_PRIVATE);
response = (shared.getBoolean(KEYFIRST, done));
您的錯誤是:
@Override
protected void onStart() {
super.onStart();
Log.d("TEST2", "STRAT3");
SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE);
Boolean state = sp.getBoolean(KEYFIRST, done);
Toast.makeText(getApplicationContext(), ""+done, Toast.LENGTH_LONG).show();
}
您要在Toast中顯示var完成,這本來是錯誤的,您必須顯示var狀態。
因為它:
@Override
protected void onStart() {
super.onStart();
Log.d("TEST2", "STRAT3");
SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE);
Boolean state = sp.getBoolean(KEYFIRST, done);
Toast.makeText(getApplicationContext(), ""+state, Toast.LENGTH_LONG).show();
}
基本上,問題在於您要保存SharedPreferences的上下文。 問候。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.