使用SharedPreferences保存活动状态

时间:2015-07-09 16:12:16

标签: android sharedpreferences

我正在编写一个应用程序,我必须保存活动状态。我在活动中有一个问题和一些按钮。当用户点击正确答案时,会同时发生更多事件。

1.手机在振动。

2.出现了imageview。

3.按钮被禁用。

我想保存图像视图和按钮状态但是当我点击后退按钮并再次打开活动时,它全部消失了,我必须从头开始。我使用SharedPrefernces保存它们但它不起作用。我创建了一个布尔类型,它在开头是假的。当用户选择正确的答案时,布尔值变为真,如果它为真,则事件发生。 我在onStop方法中保存了这个真实状态,我使用Toast来显示布尔值的状态。当我选择正确的答案时,Toast会显示" true"当我再次打开活动时,它会显示" false"。 很明显,试图拯救"真正的"状态不好,但是我使用正确的商店类型来保存图像视图和按钮状态吗? 所以我正在努力解决的问题是使用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");
}

}

1 个答案:

答案 0 :(得分:0)

当您按后退按钮时,它执行的默认操作是完成您的活动。

因此,如果您使用的是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 Done,原来是假的,你必须显示状态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的上下文。 问候。