我只是测试共享首选项的想法来保存用户进度,但是这个简单的代码不起作用,当我通过lev1它应该更新preffile以便在下一个应用程序启动时它应该直接打开到lev2Activity ,一切都很好,即使日志猫干净但没有任何反应,我不知道我的代码有什么不对,任何帮助都将不胜感激。
MainActivity.java
private Button b1;
public static final String levstate= "levstate";
private Context mycontext;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mycontext= this;
b1= (Button) findViewById(R.id.b1);
b1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
MainActivity.savelevstate(1, mycontext);
Intent i= new Intent(MainActivity.this, Lev1Activity.class);
startActivity(i);
}
});
}
public static void savelevstate(int state, Context mycontext)
{
SharedPreferences pref= mycontext.getSharedPreferences("preffile", MODE_APPEND);
Editor editor= pref.edit();
editor.putInt("levstate", state);
editor.commit();
}
public static int getlevstate(Context mycontext)
{
SharedPreferences pref= mycontext.getSharedPreferences("preffile", MODE_APPEND);
int state= pref.getInt("levstate", 1);
return state;
}
Lev1Activity.java
私人EditText et1; 私人按钮b1;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lev1);
et1= (EditText) findViewById(R.id.et1);
b1= (Button) findViewById(R.id.b1);
}
public void Next (View v)
{
String value= et1.getText().toString();
int finalvalue= Integer.parseInt(value);
if(finalvalue==22)
{
Intent i = new Intent (this, Lev2Activity.class);
startActivity(i);
MainActivity.savelevstate(2, this);
this.finish();
}
}
答案 0 :(得分:3)
您使用sharedPreferences
的想法非常好。但是,如果查看MainActivity的onCreate()
,您可以看到在启动意图之前从未检查过最后一级状态。该应用运行,用户点击按钮“b1”,它立即启动Lev1Activity
。假设您希望在用户按下相同按钮时启动正确的级别,则必须检查当前级别状态,然后将该状态链接到其适当级别的活动。
例如(MainActivity.java):
b1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
Intent i;
switch(getlevstate(myContext)) {
case 1:
i = new Intent(myContext, Lev1Activity.class);
break;
case 2:
i = new Intent(myContext, Lev2Activity.class);
break;
case 3:
i = new Intent(myContext, Lev3Activity.class);
break;
case 4
i = new Intent(myContext, Lev4Activity.class);
break;
...
}
startActivity(i);
}
});
使用MODE_APPEND
应该与使用MODE_PRIVATE
一样有效,但建议使用后者。
答案 1 :(得分:0)
不确定这是不是问题,但是当我使用偏好设置时,我使用Context.MODE_PRIVATE
这是我的代码和你的代码之间的唯一区别,也许它会有所帮助!
编辑:我可能错了,但我无法看到getlevstate
的任何地方。设置完
et1= (EditText) findViewById(R.id.et1);
你应该像这样做一些事情:
et1.setText(""+getlevstate(this))
答案 2 :(得分:0)
我建议您创建一个使用SharedPreferences的新类。
以下是从共享首选项保存和检索数据的示例:
public class SharedPreferenceSettings {
private static final String PREFS_NAME = "MY_APP_SETTINGS";
private static final String PREFS_LANGUAGE = "LANGUAGE";
private static final String PREFS_CITY = "CITY";
private final SharedPreferences settings;
public SharedPreferenceSettings(Context context) {
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}
public void setLanguage(String language) {
settings.edit().putString(PREFS_LANGUAGE, language).apply();
}
public String getlanguage() {
return settings.getString(PREFS_LANGUAGE, "english");
}
public void setCity(String city) {
settings.edit().putString(PREFS_CITY, city).apply();
}
public String getCity() {
return settings.getString(PREFS_CITY, "london");
}
}
有关详细信息,请查看官方Android文档 - link
答案 3 :(得分:0)
您只保存状态,但您无法在代码中的任何位置进行检查。
在MainActivity
试试这个:
b1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
if(getlevstate(MainActivity.this)==2) {
Intent i= new Intent(MainActivity.this, Lev2Activity.class);
startActivity(i);
} else {
MainActivity.savelevstate(1, mycontext);
Intent i= new Intent(MainActivity.this, Lev1Activity.class);
startActivity(i);
}
}
});