【问题标题】:Save activity state with SharedPreferences使用 SharedPreferences 保存活动状态
【发布时间】:2015-07-09 16:12:16
【问题描述】:

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

1.手机在振动。

2.出现一个图像视图。

3.按钮被禁用。

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

}

【问题讨论】:

    标签: android sharedpreferences


    【解决方案1】:

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

    所以如果你使用 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 的上下文。 问候。

    【讨论】:

    • 感谢您的回答!不幸的是,您的代码对我不起作用。当答案正常时,吐司显示为真,当我再次打开它时,布尔值是假的,图像视图消失了。你能告诉我为什么你更喜欢SqliteDB吗?我读到它用于结构数据。
    • 好的,为什么不起作用,它会给你一些错误吗?如果是的话,你能分享你的 logcat 来检查一下,我分享给你的代码我在一些项目中使用并且有效,所以让我们检查一下为什么不
    • 也检查这个解决方案:stackoverflow.com/questions/151777/…
    • 我发现了你的错误,检查我答案的最后几行,我会给你错误
    • 你说得对,我在 Toast 中将状态改为完成,现在当我再次打开活动时,它是真的。但是为什么我的照片不见了?我应该使用其他类型的商店吗?你认为如果我使用 onSaveInstanceState 或 SqliteDB 会比 SharedPreferences 更好吗?
    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多