Android:如何从首选项中选择一个主题后,将主题应用于应用程序的所有活动?

时间:2014-12-01 15:05:38

标签: android android-preferences android-theme

我制作了一个简单的应用程序,我希望在从首选项中选择后更改应用程序的所有活动的主题(包括设置活动),但选择后主题不适用。我尝试添加了一个重新创建(),但却试图启动主要活动。现在,我添加了一个重新创建()的菜单项,但我希望它在您离开设置活动后自动应用。

MainActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {

    SharedPreferences getData = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    String themeValues = getData.getString("theme_preference", "1");

    if (themeValues.equals("1")) {
        setTheme(R.style.Theme_Light);
    }

    if (themeValues.equals("2")) {
        setTheme(R.style.Theme_Dark);
    }

    if (themeValues.equals("3")) {
        setTheme(R.style.Theme_Red);
    }

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
}

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (id == R.id.action_settings) {
            Intent i = new Intent("com.cyanoise.helloworld.SettingsActivity");
            startActivity(i);

        return true;
    }

    if (id == R.id.about_app) {
        startActivity(new Intent(MainActivity.this, AboutActivity.class));

        return true;
    }

    if (id == R.id.refresh_app) {
        recreate();

        return true;
    }

    if (id == R.id.exitapp) {
        finish();
    }

    return super.onOptionsItemSelected(item);
}

SettingsActivity.java:

public class SettingsActivity extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);
    }
}

非常感谢所有答案。

2 个答案:

答案 0 :(得分:0)

为了在返回每个活动时在每个活动中应用新主题,但仍然只在必要时重新创建活动,我使用自编的IProducerConsumerCollection<T>,我的所有活动都从该活动继承。

BaseActivity中,每个活动的主题都设置并保存在字符串变量onCreate()中。通过记住每个活动的当前主题,只要用户转向此活动,您就可以将其与theme中的SharedPreferences中的新主题进行比较。

像这样,如果主题尚未匹配,您只需要在恢复的活动上调用onResume(),以使每个活动都显示最新的主题。

this.recreate()

答案 1 :(得分:-1)

好的,所以我一直在玩,并找到了解决方法。我在SettingsActivity中添加了一个onBackPressed()以再次显示MainActivity,它似乎可以工作,一旦退出设置活动就应用所选主题。

@Override
public void onBackPressed() {
    super.onBackPressed();
    startActivity(new Intent(SettingsActivity.this, MainActivity.class));
}

至于我刚刚添加的所有活动应用主题

SharedPreferences getData = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    String themeValues = getData.getString("theme_preference", "1");

    if (themeValues.equals("1")) {
        setTheme(R.style.Theme_Light);
    }

    if (themeValues.equals("2")) {
        setTheme(R.style.Theme_Dark);
    }

    if (themeValues.equals("3")) {
        setTheme(R.style.Theme_Red);
    }

每次活动的每次创造。