【问题标题】:Change Theme not working更改主题不起作用
【发布时间】:2014-01-06 17:05:56
【问题描述】:

我正在尝试更改我的主题,选择 BaseExpandableListAdapter 选项。我可以选择选项,而且它似乎运行正常。我在日志中有很好的结果。但是主题不会改变。有人可以帮忙吗?我可能会错过什么?

这是我MainActivity的一部分:

public class MainActivity extends Activity {

static final int THEME_REQUEST = 1;

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == THEME_REQUEST) {
        if (resultCode == RESULT_OK) {
            Bundle bundle = data.getExtras();
            System.out.println("Troca tema: " + bundle.getInt("theme"));
            alteraTema(bundle.getInt("theme"));
        }
    }
}

public void alteraTema(int sTheme) {
    switch (sTheme)
    {
    default:
    case 0:
        System.out.println("Tema BA");
        this.setTheme(R.style.JUCEB);
        this.recreate();
        break;
    case 1:
        System.out.println("Tema ES");
        this.setTheme(R.style.JUCEES);
        this.recreate();
        break;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (Configuracao.urlApi == null){
        Intent intent = new Intent(MainActivity.this, Configuracao.class);
        startActivityForResult(intent, THEME_REQUEST);
    }

这是我的styles.xml:

<resources xmlns:android="http://schemas.android.com/apk/res/android">

<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light"></style>

<!-- Application theme. -->
<style name="Inicial" parent="AppBaseTheme">
    <item name="android:actionBarStyle">@style/Inicial.ActionBar</item>
</style>

<style name="Inicial.ActionBar" parent="@android:style/Widget.Holo.ActionBar">
    <item name="android:background">@drawable/logo_generico</item>
    <item name="android:icon">@android:color/transparent</item>
    <item name="android:titleTextStyle">@style/NoTitleText</item>
    <item name="android:subtitleTextStyle">@style/NoTitleText</item>
</style>

<style name="JUCEES" parent="AppBaseTheme">
    <item name="android:actionBarStyle">@style/JUCEES.ActionBar</item>
</style>

<style name="JUCEES.ActionBar" parent="@android:style/Widget.Holo.ActionBar">
    <item name="android:background">@drawable/logo_es</item>
    <item name="android:icon">@android:color/transparent</item>
    <item name="android:titleTextStyle">@style/NoTitleText</item>
    <item name="android:subtitleTextStyle">@style/NoTitleText</item>
</style>

<style name="JUCEB" parent="AppBaseTheme">
    <item name="android:actionBarStyle">@style/JUCEB.ActionBar</item>
</style>

<style name="JUCEB.ActionBar" parent="@style/Widget.AppCompat.ActionBar">
    <item name="android:background">@drawable/logo_ba</item>
    <item name="android:icon">@android:color/transparent</item>
    <item name="android:titleTextStyle">@style/NoTitleText</item>
    <item name="android:subtitleTextStyle">@style/NoTitleText</item>
</style>

<style name="NoTitleText">
    <item name="android:textSize">0sp</item>
    <item name="android:textColor">#00000000</item>
</style>

更新 1

我做了这些改变:

public void alteraTema(int sTheme) {
    switch (sTheme)
    {
    case 0:
        temaEscolha = (R.style.JUCEB);
        setTheme(temaEscolha);
        System.out.println("Tema BA");
        break;
    case 1:
        temaEscolha = (R.style.JUCEES);
        setTheme(temaEscolha);
        System.out.println("Tema ES");
        break;
    }

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTheme(temaEscolha);
    setContentView(R.layout.activity_main);

现在我可以为除 Main_Activity 之外的每个 Activity 更改主题。 它仅适用于我第一次更改主题。当我再次尝试更改时,不工作。

更新 2

我这样做了:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == THEME_REQUEST) {
        if (resultCode == RESULT_OK) {
            Bundle bundle = data.getExtras();
            System.out.println("Troca tema: " + bundle.getInt("theme"));
            alteraTema(bundle.getInt("theme"));
            startActivity(getIntent());
            finish();
        }
    }
}

在我的 Confi.java 中,我的选择在哪里,我有这个:

    private void finishWithResult() {
    Intent intent = new Intent();
    intent.putExtra("theme", Selecao);
    setResult(Activity.RESULT_OK, intent);
    finish();
}

已解决

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == THEME_REQUEST) {
        if (resultCode == RESULT_OK) {
            Bundle bundle = data.getExtras();
            System.out.println("Troca tema: " + bundle.getInt("theme"));
            alteraTema(bundle.getInt("theme"));
            finish();
            startActivity( getIntent() );
        }
    }
}

【问题讨论】:

    标签: android themes android-theme expandablelistadapter


    【解决方案1】:

    必须在调用 setContentView() 之前设置主题(请参阅documentation)。设置后,您无法更改主题,只能通过重新启动 Activity。 因此,在您的 onActivityResult 方法中,您需要以下内容:

        startActivity( getIntent() );
        finish();
    

    当然,您必须以某种方式记住所选主题(SharedPreferences 或将其放入 Intent)。

    另请参阅此帖子:https://stackoverflow.com/a/11576546/534471

    【讨论】:

    • 谢谢!但是这样我只改变了一个活动主题,而不是整个应用程序,对吧?我需要更改所有活动的主题。
    • 受保护的 void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.JUCEES); setContentView(R.layout.activity_main);
    • 是的,它改变了一个活动的主题。如果您在代码中选择主题,那么您必须在每个活动中设置它。您可以实现自己的 Activity 类(如 MyActivity)来扩展 Activity 并在 onCreate() 中设置主题。您的每个 Activity 类都将扩展 MyActivity 并在调用 setContentView 之前调用 super.onCreate。
    • 我确实更新了我的答案。除了 Main_Activity,我无法更改每个 Activity 的主题。
    • 正如我所提到的,您需要重新启动 Activity,然后它才能获取主题更改。您没有为 MainActivity 执行此操作,因此它不起作用。添加我在上面发布的代码行,你会很好。如果其他活动正在运行,它们也需要重新启动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多