更新android中的共享优先级

时间:2015-08-17 21:57:58

标签: java android

我只是测试共享首选项的想法来保存用户进度,但是这个简单的代码不起作用,当我通过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();




    }

}

4 个答案:

答案 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);
        }
    }

});