使用listpreference为app添加主题支持

时间:2014-01-07 06:58:58

标签: android

我正在尝试为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>

如果有人可以帮助我,我会很感激吗?

1 个答案:

答案 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。