[英]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.