您好我正在尝试使用共享首选项保存主题。当用户点击具有特定主题的按钮时,我希望将该主题设置为默认并保存,以便当他们重新打开应用程序时仍然是该新主题。
主要活动:
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Utils.onActivityCreateSetTheme(this);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
findViewById(R.id.button3).setOnClickListener(this);
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.button1:
Utils.changeToTheme(this, Utils.THEME_DEFAULT);
break;
case R.id.button2:
Utils.changeToTheme(this, Utils.THEME_WHITE);
break;
case R.id.button3:
Utils.changeToTheme(this, Utils.THEME_BLUE);
break;
}
}
}
的Utils:
public class Utils{
private static int sTheme;
public final static int THEME_DEFAULT = 0;
public final static int THEME_WHITE = 1;
public final static int THEME_BLUE = 2;
/**
* Set the theme of the Activity, and restart it by creating a new Activity of the same type.
*/
public static void changeToTheme(Activity activity, int theme)
{
sTheme = theme;
activity.finish();
activity.startActivity(new Intent(activity, activity.getClass()));
}
/** Set the theme of the activity, according to the configuration.
* @param activity*/
public static void onActivityCreateSetTheme(MainActivity activity)
{
switch (sTheme)
{
default:
case THEME_DEFAULT:
activity.setTheme(R.style.AppTheme);
break;
case THEME_WHITE:
activity.setTheme(R.style.MyTheme);
break;
case THEME_BLUE:
activity.setTheme(R.style.My2Theme);
break;
我还希望为所有活动保存主题,而不仅仅是单击按钮的主题。感谢
答案 0 :(得分:2)
在您的主要活动中,对onClick进行以下更改:
/var/www/www.example.com/src/media/
然后,在onCreate的顶部,在super和setContentView之前添加它:
@Override
public void onClick(View v)
{
//Setup the SharedPreferences
SharedPreferences mSettings = this.getSharedPreferences("Themes", 0);
//SharedPrerefences Editor (to add content to SP)
SharedPreferences.Editor editor = mSettings.edit();
switch (v.getId())
{
case R.id.button1:
Utils.changeToTheme(this, Utils.THEME_DEFAULT);
//Add the theme's int to SharedPreferences
editor.putInt("theme", Utils.THEME_TEAL);
//Apply the save
editor.apply();
break;
case R.id.button2:
Utils.changeToTheme(this, Utils.THEME_WHITE);
//Add the theme's int to SharedPreferences
editor.putInt("theme", Utils.THEME_TEAL);
//Apply the save
editor.apply();
break;
case R.id.button3:
Utils.changeToTheme(this, Utils.THEME_BLUE);
//Add the theme's int to SharedPreferences
editor.putInt("theme", Utils.THEME_TEAL);
//Apply the save
editor.apply();
break;
}
}
我们在这里做的是:
现在,当您单击白色主题按钮的按钮时,它将应用它。
答案 1 :(得分:0)
我已经包含了一个适合您的示例。有关详细信息,请参阅http://developer.android.com/guide/topics/data/data-storage.html#pref。由于PREFS_NAME是公开的,您可以调用getSharedPreferences(MyActivity.PREFS_NAME,0);从其他活动访问相同的SharedPreferences
班上的字段
public static final String PREFS_NAME = "MyPrefsFile";
将此代码放在要在SharedPreferences
中保存主题选项的位置 SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
//"theme" is the key sTheme is the value you're saving
editor.putInt("theme", sTheme);
editor.commit();
并将此代码放在您想要获得该值的位置
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
//"theme" is the same key 0 is the default value
int theme = settings.getInt("theme", 0);
答案 2 :(得分:0)
在这里你可以找到关于SharedPreferences 的教程,基本上你应该存储所选主题的编号,当应用程序启动时,检查哪一个存储在SharedPreferences上。检索完该值后,您可以"存储"它在全球范围内检查其他活动的主题编号(这样,您不必每次都检查SharedPreferences,就在应用程序启动时)。
更新0
这是一个处理SharedPreference东西的类:
public class SharedPreferencesManager {
/**
* SharedPreferences to store the settings. This way, they'll be available next time the user starts the app
*/
private SharedPreferences sPreferences;
/**
* Editor to make changes on sharedPreferences
*/
private SharedPreferences.Editor sEditor;
/**
* The class itself
*/
private Context context;
public SharedPreferencesManager(Context context){
this.context = context;
sPreferences = PreferenceManager.getDefaultSharedPreferences(context);
}
private SharedPreferences.Editor getEditor(){
return sPreferences.edit();
}
/**
* Store a boolean value in sharedPreferences
* @param tag identifies the value
* @param value the value itself
*/
public void storeBoolean(String tag, boolean value){
sEditor = getEditor();
sEditor.putBoolean(tag,value);
sEditor.commit();
}
/**
* Store a string in sharedPreferences
* @param tag identifies the value
* @param str the string itself
*/
public void storeString(String tag, String str){
sEditor = getEditor();
sEditor.putString(tag, str);
sEditor.commit();
}
/**
*
* @param tag identifies the value
* @param defValue default value
* @return the stored or default value
*/
public boolean retrieveBoolean(String tag, boolean defValue){
return sPreferences.getBoolean(tag,defValue);
}
/**
*
* @param tag identifies the string
* @param defStr default string
* @return the stored or default string
*/
public String retrieveString(String tag, String defStr){
return sPreferences.getString(tag, defStr);
}
/**
*
* @param tag identifies the value
* @param defValue default value
* @return the stored or default value
*/
public int retrieveInt(String tag, int defValue){
return sPreferences.getInt(tag, defValue);
}
/**
*
* @param tag identifies the value
* @param defValue the value itself
*/
public void storeInt(String tag, int defValue){
sEditor = getEditor();
sEditor.putInt(tag, defValue);
sEditor.commit();
}
//Incorrect Bracket Closing Removal.
使用此类,您可以在SharedPreferences上存储和检索不同类型的值。在您的情况下,您需要存储主题的值。你有:
public final static int THEME_DEFAULT = 0;
public final static int THEME_WHITE = 1;
public final static int THEME_BLUE = 2;
因此,在用户选择主题后,您应该致电:
new SharedPreferencesManager(getApplicationContext()).storeInt("theme", THEME_WHITE);
您可以在onClick()
处理程序上调用此函数,或者您认为它更好:)
要检索存储的主题值,请在onCreate方法上调用以下代码:
Utils.changeToTheme(this, new SharedPreferencesManager(this).retrieveInt("theme", THEME_WHITE));
请记住,当您想要从SharedPreferences中检索值时,必须传递默认值,因此如果没有任何与标记"主题相关的内容"存储后,它将返回默认值。
我没有测试过这段代码,也许你不得不稍微调试一下。