SharedPreferences 代码未按预期工作
SharedPreferences code not working as intended
添加了所有必要的导入。
public class MainActivity extends AppCompatActivity {
SharedPreferences preferences;
SharedPreferences.Editor editor;
public int i;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
editor = preferences.edit();
在第一次启动时会出现 "First time boot" 消息,但下次不应出现,而应出现保存在 sharedPreferences 中的迭代器 i。
try{
i = preferences.getInt("iterator", 0);
Toast.makeText(getApplicationContext(), i, Toast.LENGTH_SHORT).show();
}catch(Exception e){
Toast.makeText(MainActivity.this, "First time boot", Toast.LENGTH_SHORT).show();
}
final TextView date = (TextView) (findViewById(R.id.textView));
final Calendar c = Calendar.getInstance();
date.setText(DateFormat.getDateFormat(this).format(c.getTime()));
final Button mainBtn = (Button) findViewById(R.id.mainBtn);
final Button exit = (Button) findViewById(R.id.exit);
mainBtn.setText("Clock In");
mainBtn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(mainBtn.getText() == "Clock In"){
mainBtn.setText("Clock Out");
}else{mainBtn.setText("Clock In");}
String s = new SimpleDateFormat("yyyy: MM: dd HH: mm: ss").format(Calendar.getInstance().getTime());
我的想法是,单击按钮后,时间戳将保存到 sharedPreferences 文件中,稍后可以访问该文件。
editor.putString("Time "+ i, s);
i++;
editor.putInt("iterator", i);
}
});
我最近才添加这个,这样当您单击退出按钮时,放入 sharedPreferences 文件中的所有内容都会被保存。 (之前的 editor.commit() 行在 mainBtn onClickListener 中)。
exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editor.commit();
finish();
}
});
}
问题是退出应用程序并重新启动后,应用程序不会检索存储的数据,这些数据应该保存在 sharedPreferences 文件中,而是每次都显示 "First time boot" .. 我对编程非常陌生,并尝试以多种方式解决这个问题,但最终还是遇到了同样的问题。求助!
据我所知preferences.getInt("iterator", 0);如果 "iterator" 不存在,则不会抛出异常。它将 return 一个 0。0 是默认值。我会将您的代码更改为更像:
int iterator = preferences.getInt("iterator", -1);
if (iterator == -1)
Toast.makeText(this, "First time boot", Toast.LENGTH_SHORT).show();
如果您查看您的异常,我猜想问题出在您的 Toast 之后,您的 getInt("Iterator", 0) 调用传递了一个 int 而不是一个字符串。
此外,我不会在您的应用程序中让编辑器一直处于打开状态。我通常会写一个像
这样的函数
void savePreference(String key, String value) {
SharedPreferences prefs = context.getSharedPreferences(PREFERENCES_NAME, 0);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(key, value);
editor.commit();
}
添加了所有必要的导入。
public class MainActivity extends AppCompatActivity {
SharedPreferences preferences;
SharedPreferences.Editor editor;
public int i;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
editor = preferences.edit();
在第一次启动时会出现 "First time boot" 消息,但下次不应出现,而应出现保存在 sharedPreferences 中的迭代器 i。
try{
i = preferences.getInt("iterator", 0);
Toast.makeText(getApplicationContext(), i, Toast.LENGTH_SHORT).show();
}catch(Exception e){
Toast.makeText(MainActivity.this, "First time boot", Toast.LENGTH_SHORT).show();
}
final TextView date = (TextView) (findViewById(R.id.textView));
final Calendar c = Calendar.getInstance();
date.setText(DateFormat.getDateFormat(this).format(c.getTime()));
final Button mainBtn = (Button) findViewById(R.id.mainBtn);
final Button exit = (Button) findViewById(R.id.exit);
mainBtn.setText("Clock In");
mainBtn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(mainBtn.getText() == "Clock In"){
mainBtn.setText("Clock Out");
}else{mainBtn.setText("Clock In");}
String s = new SimpleDateFormat("yyyy: MM: dd HH: mm: ss").format(Calendar.getInstance().getTime());
我的想法是,单击按钮后,时间戳将保存到 sharedPreferences 文件中,稍后可以访问该文件。
editor.putString("Time "+ i, s);
i++;
editor.putInt("iterator", i);
}
});
我最近才添加这个,这样当您单击退出按钮时,放入 sharedPreferences 文件中的所有内容都会被保存。 (之前的 editor.commit() 行在 mainBtn onClickListener 中)。
exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editor.commit();
finish();
}
});
}
问题是退出应用程序并重新启动后,应用程序不会检索存储的数据,这些数据应该保存在 sharedPreferences 文件中,而是每次都显示 "First time boot" .. 我对编程非常陌生,并尝试以多种方式解决这个问题,但最终还是遇到了同样的问题。求助!
据我所知preferences.getInt("iterator", 0);如果 "iterator" 不存在,则不会抛出异常。它将 return 一个 0。0 是默认值。我会将您的代码更改为更像:
int iterator = preferences.getInt("iterator", -1);
if (iterator == -1)
Toast.makeText(this, "First time boot", Toast.LENGTH_SHORT).show();
如果您查看您的异常,我猜想问题出在您的 Toast 之后,您的 getInt("Iterator", 0) 调用传递了一个 int 而不是一个字符串。
此外,我不会在您的应用程序中让编辑器一直处于打开状态。我通常会写一个像
这样的函数void savePreference(String key, String value) {
SharedPreferences prefs = context.getSharedPreferences(PREFERENCES_NAME, 0);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(key, value);
editor.commit();
}