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); 星触觉(意向); } }); } }
我正试图在计时器启动后从游戏屏幕上保存一个高分。我可以很好地做到这一点,当我再次访问我的ArrayList时,最后的分数被重新保存,我不知道为什么会发生这种情况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()。实际上,您可能不会将高分保存到首选项两次。我认为问题在于你在
例如,当一场比赛以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);
}
});
}
}