启动活动时不保存首选项并清除变量

时间:2018-08-07 22:55:08

标签: java android sharedpreferences

在我的MainActivity上,我有一个计数器来跟踪“赢,输和输”,单击一个按钮后,将启动另一个活动,当该活动结束时,将询问用户是赢还是输还是输。我正在尝试更新我的主要活动上的计数器,但偏好设置似乎没有正确存储,在完成第二个活动并返回第一个活动之后,计数器会更新,但是当再次进入第二个活动时,计数器被清除并恢复为零。尽管先前使用成功,首选项似乎也没有保存。

调试没有完成任何事情,我将不胜感激!

来自MainActivity:

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

    new FlurryAgent.Builder().withLogEnabled(true).build(this, "");

    setContentView(R.layout.activity_main);

    SharedPreferences pref = getApplicationContext().getSharedPreferences("MainPref", MODE_PRIVATE);
    final SharedPreferences.Editor editor = pref.edit();

    editor.putInt("wins", numberOfWins);
    editor.putInt("draws", numberOfDraws);
    editor.putInt("losses", numberOfLosses);

    numberOfWins = pref.getInt("wins", 0);
    numberOfDraws = pref.getInt("draws", 0);
    numberOfLosses = pref.getInt("losses", 0);

    TextView wins = findViewById(R.id.numberOfWins);
    wins.setText(String.valueOf(numberOfWins));

    TextView draws = findViewById(R.id.numberOfDraws);
    draws.setText(String.valueOf(numberOfDraws));

    TextView losses = findViewById(R.id.numberOfLosses);
    losses.setText(String.valueOf(numberOfLosses));

    editor.commit();

从第二个活动开始:

final ImageButton completeBattle = findViewById(R.id.completeBattle);
    completeBattle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final Dialog dialog = new Dialog(BattleActivity.this);
            dialog.setContentView(R.layout.custom_dialog);

            dialog.show();

            Button cancelBtn = dialog.findViewById(R.id.cancelBtn);
            cancelBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    dialog.dismiss();

                }
            });

            Button winBtn = dialog.findViewById(R.id.winBtn);
            winBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    MainActivity.numberOfWins++;

                    editor.clear();
                    editor.commit();



                    dialog.dismiss();

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

                }
            });

            Button drawBtn = dialog.findViewById(R.id.drawBtn);
            drawBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    MainActivity.numberOfDraws++;

                    editor.clear();
                    editor.commit();



                    dialog.dismiss();

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

                }
            });

            Button loseBtn = dialog.findViewById(R.id.loseBtn);
            loseBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    MainActivity.numberOfLosses++;

                    editor.clear();
                    editor.commit();




                    dialog.dismiss();

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

                }
            });

也许值得一提的是,我在第二项活动中运行了另一组偏好设置,用于跟踪一组不同的计数器,并且当用户完成游戏时,这些计数器将重置。

1 个答案:

答案 0 :(得分:0)

启动活动时,它是一个新实例,并且不知道该活动的先前实例或它们的状态。您需要将其从主活动开始所需的任何状态数据传递给活动,您可以使用Intent的额外数据将数据传递给新活动。同样,当第二个活动结束时,它需要使用startActivityForResult将数据传递回第一个活动。

基本上,您的主要“活动”必须是存储所有持久状态的状态数据,然后将其传递和接收到子活动的地方。