自定义SharedPreferences类

问题描述:

我是新来的android和学习。我的应用程序中有主题更改选项,用户可以从中切换主题。我正在使用一个全局变量来保存应用程序中的主题编号,但是当应用程序从背景中清除时,它正在遭受损失。所以我曾想过为此使用SharedPreferences。我找到了一种简单易用的方法来存储和检索SharedPreference从here自定义SharedPreferences类

我的代码是像下面

public class Keystore { 
    private static Keystore store; 
    private SharedPreferences SP; 
    private static String filename="Keys"; 
    public static int theme=1; 

    private Keystore(Context context) { 
     SP = context.getApplicationContext().getSharedPreferences(filename,0); 
    } 

    public static Keystore getInstance(Context context) { 
     if (store == null) { 
      store = new Keystore(context); 
     } 
     return store; 
    } 

    public void put(String key, String value) { 
     SharedPreferences.Editor editor; 
     editor = SP.edit(); 
     editor.putString(key, value); 
     editor.apply(); 
    } 

    public String get(String key) { 
     return SP.getString(key, null); 
    } 

    public int getInt(String key) { 
     return SP.getInt(key, 0); 
    } 

    public void putInt(String key, int num) { 
     SharedPreferences.Editor editor; 
     editor = SP.edit(); 

     editor.putInt(key, num); 
     editor.apply(); 
    } 

    public void clear(){ 
     SharedPreferences.Editor editor; 
     editor = SP.edit(); 

     editor.clear(); 
     editor.apply(); 
    } 

    public void remove(){ 
     SharedPreferences.Editor editor; 
     editor = SP.edit(); 

     editor.remove(filename); 
     editor.apply(); 
    } 
} 

而且按例如在原来的答案给定的,我想用它在我的活动类像下面获得价值

int theme= store.getInt("theme"); 
Log.d(getClass().getName(),"theme"+theme); 

但它返回的是0而不是1.我还怀疑我已将类的默认值保存为1,例如public static int theme=1;这是在SharedPreferences中保存默认值的正确方法吗?

感谢

+0

您在共享偏好中保存了哪些值? –

+0

@VivekMishra我用它像public static int theme = 1;为默认,并没有承诺任何保存到现在为止。 – Priya

+0

如果你还没有保存任何值,那么你从共享首选项中获取什么?它将始终返回整数的默认值,即0 –

您应该使用commit()

提交自己的喜好从这个编辑器的 SharedPreferences变回对象是编辑。这会自动执行 请求的修改,替换SharedPreferences中当前的任何内容。

public void putInt(String key, int num) 
    { 
     SharedPreferences.Editor editor; 
     editor = SP.edit(); 

     editor.remove("key"); 
     editor.putString("key", num); 
     editor.commit(); // IF commit() showing warning then use apply() instead . 
     editor.apply(); 

    } 

注意

如果你不关心的返回值和你使用这个从 应用程序的主线程,可以考虑使用适用()代替。

+1

提交用于现在发出警告。建议使用apply而不是 –

+0

@VivekMishra。 –

如果你想用默认值为1时,当你不保存在sharepreferance数据,那么你必须改变在你的方法一样

public int getInt(String key) { 
    return SP.getInt(key, 1); 
} 

它会为你工作来获取。

+0

嗨!感谢您的好建议。我还有一个问题。在Example类中它使用了SP = context.getApplicationContext()。getSharedPreferences(filename,0);喜欢这个。如果我想要多键存储 – Priya

+0

如需了解有关sharepreferance的更多信息,请参阅链接:https://www.journaldev.com/9412/android-shared-preferences-example-tutorial –

+0

如果您喜欢我的答案,请接受它并upvote它。 :) –

您必须首先在共享偏好设置中保存值,以便稍后检索。要保存它使用下面的代码

store.putInt(your int value); 

和共享的偏好相同检索它就像你正在做

int theme= store.getInt("theme"); 

你可以这样来做:

private void saveTheme() 
{ 
SharedPreferences sharedpreferences = getSharedPreferences("filename here", Context.MODE_PRIVATE); 
Editor editor = sharedpreferences.edit(); 
editor.putInt("theme", 1); 
editor.commit(); 
} 



private int getTheme() 
{ 
SharedPreferences sharedpreferences = getSharedPreferences("filename here", Context.MODE_PRIVATE); 
sharedpreferences.getInt("theme",0); 
} 

您可以将它们添加在Utility类中,或者创建一个独立的PreferenceHelper类并使sharedPreference全局化。

希望它有助于!