Java SharedReferences保存数据两次 private void setHighScore(){ SharedReferences.Editor scoreEdit=gamePrefs.edit(); DateFormat dateForm=新的简化格式(“MM/dd/yy”); 字符串dateOutput=dateForm.format(newdate()); String scores=gamePrefs.getString(“highScores”和“); 如果(分数.length()>0){ List scoreStrings=new ArrayList(); 字符串[]exScores=scores.split(“\\\\”); 对于(字符串eSc:exScores){ String[]parts=eSc.split(“-”); 添加(新分数(部分[0],整数.parseInt(部分[1])); } 得分新闻核心=新得分(日期输出,得分); 添加(新闻核心); Collections.sort(scoreStrings); StringBuilder scoreBuild=新的StringBuilder(“”); 对于(int x=0;x=10)中断; 如果(x>0)scoreBuild.append(“|”); 追加(scoreStrings.get(x.getScoreText()); } scoreEdit.putString(“highScores”,scoreBuild.toString()); scoreEdit.commit(); }否则{ scoreEdit.putString(“highScores”、“+dateOutput+”-“+Scores”); scoreEdit.commit(); } } 公共类MyCount扩展了倒计时{ 公共MyCount(长百万未来,长倒计时间隔){ 超级(毫秒未来,倒计时间隔); } @凌驾 公共无效onFinish(){ 最终文本视图时间=(文本视图)findViewById(R.id.time); time.setText(“Times Up!”); 试一试{ 睡眠(250); }捕捉(中断异常e){ e、 printStackTrace(); } setHighScore(); Intent Intent=新的Intent(getApplicationContext(),score\u screen.class); 星触觉(意向); 完成(); } @凌驾 公共void onTick(长毫秒未完成){ 最终文本视图时间=(文本视图)findViewById(R.id.time); time.setText(“左:+millisuntillfinished/1000); } } 公开课分数屏幕扩展活动{ @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity\u score\u屏幕); TextView scoreView=(TextView)findViewById(R.id.scoreView); ImageButton home=(ImageButton)findViewById(R.id.home); SharedPreferences scorePrefs=getSharedPreferences(Game.Game_PREFS,0); String[]savedScores=scorePrefs.getString(“highScores”和“).split(“\\\\”); StringBuilder scoreBuild=新的StringBuilder(“”); for(字符串分数:savedScores){ scoreBuild.append(分数+“\n”); } scoreView.setText(scoreBuild.toString()); home.setOnClickListener(新视图.OnClickListener(){ 公共void onClick(视图v){ Intent Intent=新的Intent(v.getContext(),ColorMatch.class); 星触觉(意向); } }); } }

Java SharedReferences保存数据两次 private void setHighScore(){ SharedReferences.Editor scoreEdit=gamePrefs.edit(); DateFormat dateForm=新的简化格式(“MM/dd/yy”); 字符串dateOutput=dateForm.format(newdate()); String scores=gamePrefs.getString(“highScores”和“); 如果(分数.length()>0){ List scoreStrings=new ArrayList(); 字符串[]exScores=scores.split(“\\\\”); 对于(字符串eSc:exScores){ String[]parts=eSc.split(“-”); 添加(新分数(部分[0],整数.parseInt(部分[1])); } 得分新闻核心=新得分(日期输出,得分); 添加(新闻核心); Collections.sort(scoreStrings); StringBuilder scoreBuild=新的StringBuilder(“”); 对于(int x=0;x=10)中断; 如果(x>0)scoreBuild.append(“|”); 追加(scoreStrings.get(x.getScoreText()); } scoreEdit.putString(“highScores”,scoreBuild.toString()); scoreEdit.commit(); }否则{ scoreEdit.putString(“highScores”、“+dateOutput+”-“+Scores”); scoreEdit.commit(); } } 公共类MyCount扩展了倒计时{ 公共MyCount(长百万未来,长倒计时间隔){ 超级(毫秒未来,倒计时间隔); } @凌驾 公共无效onFinish(){ 最终文本视图时间=(文本视图)findViewById(R.id.time); time.setText(“Times Up!”); 试一试{ 睡眠(250); }捕捉(中断异常e){ e、 printStackTrace(); } setHighScore(); Intent Intent=新的Intent(getApplicationContext(),score\u screen.class); 星触觉(意向); 完成(); } @凌驾 公共void onTick(长毫秒未完成){ 最终文本视图时间=(文本视图)findViewById(R.id.time); time.setText(“左:+millisuntillfinished/1000); } } 公开课分数屏幕扩展活动{ @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity\u score\u屏幕); TextView scoreView=(TextView)findViewById(R.id.scoreView); ImageButton home=(ImageButton)findViewById(R.id.home); SharedPreferences scorePrefs=getSharedPreferences(Game.Game_PREFS,0); String[]savedScores=scorePrefs.getString(“highScores”和“).split(“\\\\”); StringBuilder scoreBuild=新的StringBuilder(“”); for(字符串分数:savedScores){ scoreBuild.append(分数+“\n”); } scoreView.setText(scoreBuild.toString()); home.setOnClickListener(新视图.OnClickListener(){ 公共void onClick(视图v){ Intent Intent=新的Intent(v.getContext(),ColorMatch.class); 星触觉(意向); } }); } },java,android,arraylist,sharedpreferences,Java,Android,Arraylist,Sharedpreferences,我正试图在计时器启动后从游戏屏幕上保存一个高分。我可以很好地做到这一点,当我再次访问我的ArrayList时,最后的分数被重新保存,我不知道为什么会发生这种情况 例如,当一场比赛以3170分结束后,我会进入高分屏幕,在那里我只看到一个分数实例。然后,如果我玩一个新游戏,或者从主菜单打开Highscores屏幕,我现在会看到两个相同分数的实例。(3170)我猜这是双倍提交分数,但我在highscore屏幕中找不到第二个.commit()。实际上,您可能不会将高分保存到首选项两次。我认为问题在于你在

我正试图在计时器启动后从游戏屏幕上保存一个高分。我可以很好地做到这一点,当我再次访问我的ArrayList时,最后的分数被重新保存,我不知道为什么会发生这种情况


例如,当一场比赛以3170分结束后,我会进入高分屏幕,在那里我只看到一个分数实例。然后,如果我玩一个新游戏,或者从主菜单打开Highscores屏幕,我现在会看到两个相同分数的实例。(3170)我猜这是双倍提交分数,但我在highscore屏幕中找不到第二个.commit()。

实际上,您可能不会将高分保存到首选项两次。我认为问题在于你在加分


您需要将高分插入数组中的某个位置,而不是追加高分。java数组是固定大小的,所以你可能想考虑使用一个ARAYLIST或LIKEDLIST。

< P>在我没有发布的方法中,(OnDebug()),如果有人退出,我有一个方法SethigSCORE()的第二个实例来存储分数。当我删除它时,它停止了双重写入,让我相信问题是finish()引用onDestroy()来关闭活动

调试它,您可能会发现问题。也许你打了两次setHighscore。我已经用搜索功能检查过了。我之所以认为这是一个数据问题,是因为它在游戏结束和分数屏幕活动打开后,按照我的意愿运行。第二个分数只有在第二次打开“分数”屏幕后才会出现。可能您保留的片段再次发送相同的数据。为了将字符串放入“分数”屏幕上的文本框中,需要进行追加,我已将问题缩小到setHighScore()方法中的某个内容,更具体地说,很可能与SharedReferences文件有关。
private void setHighScore(){
    SharedPreferences.Editor scoreEdit = gamePrefs.edit();
    DateFormat dateForm = new SimpleDateFormat("MM/dd/yy");
    String dateOutput = dateForm.format(new Date());
    String scores = gamePrefs.getString("highScores", "");
    if(scores.length() > 0) {
        List<Score> scoreStrings = new ArrayList<Score>();
        String[] exScores = scores.split("\\|");
        for(String eSc : exScores){
            String[] parts = eSc.split(" - ");
            scoreStrings.add(new Score(parts[0], Integer.parseInt(parts[1])));
        }
        Score newScore = new Score(dateOutput, score);
        scoreStrings.add(newScore);
        Collections.sort(scoreStrings);
        StringBuilder scoreBuild = new StringBuilder("");
        for (int x = 0; x < scoreStrings.size(); x++){
            if(x >= 10) break;
            if(x > 0) scoreBuild.append("|");
            scoreBuild.append(scoreStrings.get(x).getScoreText());
        }
        scoreEdit.putString("highScores", scoreBuild.toString());
        scoreEdit.commit();
    }else{
        scoreEdit.putString("highScores", ""+dateOutput+ " - " + score);
        scoreEdit.commit();
    }
}

public class MyCount extends CountDownTimer{
    public MyCount(long millisInFuture,long countDownInterval){
        super(millisInFuture, countDownInterval);
    }

    @Override
    public void onFinish() {
        final TextView time = (TextView) findViewById(R.id.time);
        time.setText("Times Up!");
        try {
            Thread.sleep(250);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setHighScore();
        Intent intent = new Intent(getApplicationContext(), score_screen.class);
        startActivity(intent);
        finish();
    }

    @Override
    public void onTick(long millisUntilFinished){
        final TextView time = (TextView) findViewById(R.id.time);
        time.setText("Left: " + millisUntilFinished/1000);
    }
}
public class score_screen extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_score_screen);
        TextView scoreView = (TextView)findViewById(R.id.scoreView);
        ImageButton home = (ImageButton)findViewById(R.id.home);
        SharedPreferences scorePrefs = getSharedPreferences(Game.GAME_PREFS, 0);
        String[] savedScores = scorePrefs.getString("highScores", "").split("\\|");
        StringBuilder scoreBuild = new StringBuilder("");
        for(String score : savedScores) {
            scoreBuild.append(score+"\n");
        }
        scoreView.setText(scoreBuild.toString());

        home.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(v.getContext(), ColorMatch.class);
                startActivity(intent);
            }
        });
    }
}