无法使用SharedPreferences保存分数

时间:2017-07-30 13:07:23

标签: android

我不知道什么是错的,但是我无法在我的应用程序中保存/加载得分。在玩游戏时,得分显示得恰到好处,但它并没有保存。每次重新打开应用程序时,分数都会重置为0.每当获得特定图像时,玩家都会收到积分。

以下是代码的一部分:

布局:

 <TextView
    android:id="@+id/scoreLabel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Score : 0"
    android:textSize="20sp"
    android:textColor="@android:color/black"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.005"
    app:layout_constraintHorizontal_bias="0.849" />

主要活动:

public class MainActivity extends AppCompatActivity {


    TextView scoreLabel;
    int score = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        scoreLabel = (TextView) findViewById(R.id.scoreLabel);

        final ImageView battleLogo = (ImageView) findViewById(R.id.battleLogo);
        final ImageView crateImage = (ImageView) findViewById(R.id.crateImage);
        final ImageView prizeImage = (ImageView) findViewById(R.id.prizeImage);
        final Button openButton = (Button) findViewById(R.id.openButton);
        final Button receiveButton = (Button) findViewById(R.id.receiveButton);

        final Resources res = getResources();

        prizeImage.setVisibility(View.GONE);
        receiveButton.setVisibility(View.GONE);

        //setting preferences
        SharedPreferences myScore = this.getSharedPreferences("MyScore", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = myScore.edit();
        editor.putInt("score", score);
        editor.commit();


        openButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Random prize
                int[] cards = {R.drawable.card1, R.drawable.card2, R.drawable.card3, R.drawable.card4, R.drawable.card5,
                        R.drawable.card6, R.drawable.card7, R.drawable.card8, R.drawable.card9, R.drawable.card10, R.drawable.card11,
                        R.drawable.card12, R.drawable.card13, R.drawable.card14, R.drawable.card15, R.drawable.card16,
                        R.drawable.card17, R.drawable.card18, R.drawable.card19, R.drawable.card20, R.drawable.card21,
                        R.drawable.card22, R.drawable.card23, R.drawable.card24, R.drawable.card25, R.drawable.card26,
                        R.drawable.card27, R.drawable.card28, R.drawable.card29, R.drawable.card30, R.drawable.card31,
                        R.drawable.card32, R.drawable.card33, R.drawable.card34, R.drawable.card35};
                Random r = new Random();
                int n = r.nextInt(35);

                switch (n) {
                    case 0:
                        score += 10;
                        break;
                    case 1:
                        score += 20;
                        break;
                    case 3:
                        score += 30;
                        break;
                }

                scoreLabel.setText("Score : " + score);

                prizeImage.setImageResource(cards[n]);

                receiveButton.setVisibility(View.VISIBLE);
                prizeImage.setVisibility(View.VISIBLE);
                openButton.setVisibility(View.GONE);
                battleLogo.setVisibility(View.GONE);
                crateImage.setVisibility(View.GONE);
            }
        });


        receiveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                crateImage.setImageDrawable(res.getDrawable(R.drawable.crate));

                openButton.setVisibility(View.VISIBLE);
                battleLogo.setVisibility(View.VISIBLE);
                crateImage.setVisibility(View.VISIBLE);
                prizeImage.setVisibility(View.GONE);
                receiveButton.setVisibility(View.GONE);

            }
        });

    }
    @Override
    protected void onStart() {
        super.onStart();
        //getting preferences
        SharedPreferences prefs = this.getSharedPreferences("MyScore", Context.MODE_PRIVATE);
        score = prefs.getInt("score", 0); //0 is the default value
    }
}

2 个答案:

答案 0 :(得分:1)

您始终将0加入SharedPreferenes,因此始终为0(这恰好是您的默认值)。如果首选项已成功更新,您可以通过检查commit - True的返回值来确认这一点。更改score中的onClick变量不会更改SharedPreferences中存储的值。

您要做的是每次{/ 1}} 更新SharedPreferences score值更改(或更实际地,Activity暂停或销毁时)

答案 1 :(得分:1)

您的分数是通过onClick方法计算得出的。因此,将您的共享偏好设置保存在分数计算下方。

switch (n) {
            case 0:
                score += 10;
                break;
            case 1:
                score += 20;
                break;
            case 3:
                score += 30;
                break;
        }


SharedPreferences myScore = this.getSharedPreferences("MyScore", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = myScore.edit();
editor.putInt("score", score);
editor.commit();

当您的分数为0时,从OnCreate中移除上述保存代码。