我正在尝试为app添加主题支持。它工作正常,但我希望用户在主题之间进行选择。问题是,我不能这样做,我尝试了很多东西。我正在使用ListPreference来定义数组列表供用户选择。我无法将这些listpreference条目值与util链接。 如果我在Util中使用任何数字编辑“0”,主题可以工作,但是当我更改这些条目值(来自手机中的列表)IDK为什么时它不起作用。 以下是代码
Settings.java
public class Settings extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Util.setAppTheme(this);
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
FragmentManager mFragmentManager = getFragmentManager();
FragmentTransaction mFragmentTransaction = mFragmentManager
.beginTransaction();
PrefsFragment mPrefsFragment = new PrefsFragment();
mFragmentTransaction.replace(android.R.id.content, mPrefsFragment);
mFragmentTransaction.commit();
}
public static class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
}
}
Util.java
public class Util extends Activity {
public static void setAppTheme(Activity a) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(a);
int mTheme = Integer.parseInt(sp.getString("theme", "0"));
if(mTheme==0)
{
a.setTheme(R.style.Dark);
}
if(mTheme==1)
{
a.setTheme(R.style.Light);
}
if(mTheme==2)
{
a.setTheme(R.style.LimeLight);
}
if(mTheme==3)
{
a.setTheme(R.style.MojoLight);
}
if(mTheme==4)
{
a.setTheme(R.style.SanMarinoLight);
}
if(mTheme==5)
{
a.setTheme(R.style.LimeDark);
}
if(mTheme==6)
{
a.setTheme(R.style.MojoDark);
}
if(mTheme==7)
{
a.setTheme(R.style.SanMarinoDark);
}
}
}
的preferences.xml
<PreferenceCategory
android:title="@string/preference_category2_title">
<ListPreference android:key="list2_preference"
android:title="@string/list2_title"
android:summary="@string/list2_summary"
android:entries="@array/list2_preferences"
android:entryValues="@array/list2_preferences_values"
android:dialogTitle="@string/list2_dialog_title"/>
<SwitchPreference android:key="switch1_preference"
android:title="@string/switch1_title"
android:switchTextOff="@string/switch1_textoff"
android:switchTextOn="@string/switch1_texton"
/>
</PreferenceCategory>
styles.xml
<!-- Dark -->
<style name="Dark" parent="android:Theme.Holo">
<item name="android:windowBackground">@drawable/activity_background_dark</item>
</style>
<!-- Light -->
<style name="Light" parent="android:Theme.Holo.Light">
<item name="android:actionBarStyle">@style/ActionBar_Light</item>
<item name="android:windowBackground">@drawable/activity_background_light</item>
</style>
arrays.xml
<resources>
<string-array name="list2_preferences">
<item>Dark</item>
<item>Light</item>
<item>Light Lime</item>
<item>Light Mojo</item>
<item>Light San Marino</item>
<item>Dark Lime</item>
<item>Dark Mojo</item>
<item>Dark San Marino</item>
</string-array>
<string-array name="list2_preferences_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
</string-array>
如果有人可以帮助我,我会很感激吗?
答案 0 :(得分:1)
您列表的onItemSelected方法的代码是什么?
在初始化活动布局后,您也无法更改活动的主题。
在我当前的应用程序中,我还允许用户更改主题。为了实现这一点,我只需再次启动活动传递参数(所选主题)并完成当前活动。
在活动onCreate()
中,我然后检查参数。如果它是-1(活动第一次开始)我得到默认主题。
private static final String INTENT_EXTRA = "theme";
private boolean onCreate;
@Override
protected void onCreate(Bundle savedInstanceState) {
onCreate = true;
themeId = getIntent().getIntExtra(INTENT_EXTRA, -1);
if (themeId == -1) {
themeId = SharedPreferencesManagment
.getApplicationThemeResourceId(SharedPreferencesManagment
.getIntApplicationTheme(this));
} else {
themeId = SharedPreferencesManagment
.getApplicationThemeResourceId(themeId);
}
setTheme(themeId);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_options_theme);
initSpinner();
}
在列表的onItemSelected()
方法中,我称之为:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (!onCreate) {
Intent intent = new Intent(this, OptionsThemeActivity.class);
intent.putExtra(INTENT_EXTRA, getSelectedTheme());
startActivity(intent);
finish();
}
onCreate = false;
}
另请注意,当活动进入微调器时,也会调用onCreate-boolean作为onItemSelected()
- 方法。
(是防止infinte循环的最简单的解决方法)
ALSO: 为什么Util有活动?如果您发布的代码是您使用Util执行的所有操作,则无需在传递上下文时扩展Activity。