簡體   English   中英

使用SharedPreferences保存活動狀態

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM