簡體   English   中英

setTheme不改變主題顏色

[英]setTheme not changing the theme colors

我知道幾次問過這個問題。 但我無法在我的案例中找到問題。 我想改變應用程序的主題,但我的colorPrimary,colorAccent等等都沒有改變。

我的MainActivity擴展了BasicActivity。 它看起來像這樣:

public class MainActivity extends BasicActivity {
    public static String MY_PREFS = "MY_PREFS";
    private SharedPreferences mySharedPreferences;
    int prefMode = Activity.MODE_PRIVATE;

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private ViewPagerAdapter adapter;
    private TextView tabOne, tabTwo, tabThree;

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

}
}

這是我的BasicActivity(在這種情況下,我更簡單地表明主題來自R.style):

public class BasicActivity extends AppCompatActivity {

    public static String MY_PREFS = "MY_PREFS";
    int prefMode = Activity.MODE_PRIVATE;



    protected void onCreate(Bundle savedInstanceState) {


        JsonParser parser = new JsonParser(getApplicationContext());

        int resourceId = this.getResources().getIdentifier(parser.getThemeID(), "style", this.getPackageName());
        setTheme(R.style.c_2ecc71_BC6C2B);


        if (android.os.Build.VERSION.SDK_INT >= 19) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

        }

        super.onCreate(savedInstanceState);

    }

}

和我的XML:

<style name="c_2ecc71_BC6C2B" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">#2ecc71</item>
    <item name="colorPrimaryDark">#1ebc61</item>
    <item name="colorAccent">#BC6C2B</item>
</style>

根據之前的問題,這段代碼應該可以工作,但在我的情況下,即使我在調用setContentView(R.layout.activity_main);之前設置了主題,在XML中使用colorPrimary的視圖仍會加載舊主題的新主題顏色setContentView(R.layout.activity_main);

謝謝!

如果使用Fragments,它們將忽略你在onCreate()中設置的值,如果你覆蓋了getTheme()方法,它也會在片段中使用:

回答了不同的問題: 以編程方式更改活動的主題

@Override
public Resources.Theme getTheme() {
    Resources.Theme theme = super.getTheme();
    theme.applyStyle(R.style.c_2ecc71_BC6C2B, true);
    return theme;
}

在MainActivity或BasicActivity中使用它,具體取決於您希望它應用於何處。 您不再需要在onCreate中更改它。

您正在嘗試擴展Android的一個較新主題(API 21以上)。 除了上面的所有答案,您還可以將主題放在styles.xml(v21)中。

更多信息請訪問https://developer.android.com/training/material/compatibility.html 在此輸入圖像描述

不確定您是否真的想以編程方式設置它,但您可以嘗試這樣: 如何在運行時將主題設置為活動? 它在onCreate和setContentView之前調用setTheme不起作用

如果您希望為整個應用程序設置它,則可以更輕松/更清楚地在AndroidManifest.xml文件中進行設置。

<application android:theme="@style/CustomTheme">

此外,我非常避免使用具有其中值的樣式名稱。 使用樣式的目的是避免對值進行硬編碼並允許它們可配置和可重用。 如果您想更改colorPrimary,您還要更改樣式名稱,該怎么辦?

在清單文件中,確保活動的主題正確....

如果你想在運行時更改那種東西,你必須插入所有那些“setTheme(android.R.style.Theme_Name);” runonUiThread中的方法,如下所示:

public class BasicActivity extends AppCompatActivity {

public static String MY_PREFS = "MY_PREFS";
int prefMode = Activity.MODE_PRIVATE;



protected void onCreate(Bundle savedInstanceState) {


    JsonParser parser = new JsonParser(getApplicationContext());

    int resourceId = this.getResources().getIdentifier(parser.getThemeID(), "style", this.getPackageName());

    runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                     setTheme(R.style.c_2ecc71_BC6C2B);
                    }
                });

    recreate();
    if (android.os.Build.VERSION.SDK_INT >= 19) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

    }

    super.onCreate(savedInstanceState);

}

}

然后調用recreate()!

根據Android -

void recreate()導致使用新實例重新創建此Activity。 這導致與由於配置更改而創建Activity時基本相同的流 - 當前實例將經歷其生命周期到onDestroy(),然后在其后創建新實例。

只需修改您的BasicActivity和MainActivity,如下所示,並創建適當的主題。 您可以使用共享首選項在應用期間檢查主題狀態。

BasicActivity .java

public abstract class BasicActivity extends AppCompatActivity {

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

    try {
        if (getLayoutID() != 0) {
            setContentView(getLayoutID());
        }
    } catch (Exception ex) { /* ... */ }

    final boolean THEME_DARK = true;// read appropriate value from SP or any other storage

    Toolbar toolbar;
    if ((toolbar = getToolbar()) != null) {
        if (THEME_DARK/*  check theme type here*/) {
            toolbar.setPopupTheme(R.style.c_2ecc71_BC6C2B);
        }
        try {
            setSupportActionBar(toolbar);
        } catch (NoClassDefFoundError e) {
            // Toast
            finish();
        }
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.setStatusBarColor(getResources().getColor(R.color.colorPrimary));
    }
}

public abstract Toolbar getToolbar();

public abstract int getLayoutID();

}     

MainActivity.java

    public class MainActivity extends BasicActivity {

    private Toolbar toolbar;

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

    @Override
    public Toolbar getToolbar() {
        return toolbar == null ? toolbar = (Toolbar) findViewById(R.id.toolbar) : toolbar;
    }

    @Override
    public int getLayoutID() {
        return R.layout.activity_main;
    }
   }

您已在BaseActivity對主題進行了硬編碼,而不是獲取目標資源ID。

你需要把setTheme(value_from_resourceId);

目前,BaseActivity始終調用,無論您解析的值如何

setTheme(R.style.c_2ecc71_BC6C2B);

而不是引用運行時值

要在運行時設置主題,您可以使用以下代碼行:

setTheme(android.R.style.Theme_Name);

並在onCreate()方法中調用setContentView()和super.onCreate()方法之前編寫它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM