android - 更改主题不起作用

标签 android themes android-theme expandablelistadapter

我正在尝试更改我的主题,选择一个 BaseExpandableListAdapter 选项。我可以选择选项,而且它似乎运行正常。我在 Log 中取得了不错的成绩。但是主题不会改变。有人可以帮忙吗?我可能缺少什么?

这是我的 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);

现在我可以为每个 Activity 更改主题,Main_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() );
        }
    }
}

最佳答案

必须在调用 setContentView() 之前设置主题(参见 documentation )。设置完成后,您无法更改主题,只能通过重新启动 Activity 来更改。 因此,在您的 onActivityResult 方法中,您需要遵循以下原则:

    startActivity( getIntent() );
    finish();

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

另见这篇文章:https://stackoverflow.com/a/11576546/534471

关于android - 更改主题不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20955257/

相关文章:

android - 如何在 Android 中保留 4.1 主题并删除 TitleBar?

android - 以电子邮件地址作为目标的 SmsManager - NullPointerException

android - 在 fragment 中设置 float 操作按钮的可见性

php - 制作Wordpress主题时要注意什么

css - 如何删除 wordpress divi 主题部分之间的空格

android - 我如何找到什么?android :attr/listChoiceIndicatorSingle points to?

android - ActionBarDrawerToggle 在右侧

java - 在android上按时间对sqlite数据库进行排序

java - 用户自定义布局的更简单方法

Android 主题更改复选框项目文本颜色