我知道几次问过这个问题.但我无法在我的案例中找到问题.我想改变应用程序的主题,但我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
和我的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>
Run Code Online (Sandbox Code Playgroud)
根据之前的问题,这段代码应该可以工作但是在我的情况下,在他们的XML中有colorPrimary的视图仍然加载旧主题的新主题颜色,尽管我在调用之前设置了主题 setContentView(R.layout.activity_main);
谢谢!
您正在尝试扩展 Android 的较新主题之一(API 21 以上)。除了上面的所有答案,您还可以将您的主题放在styles.xml(v21) 中。
更多信息在这里https://developer.android.com/training/material/compatibility.html
如果您使用Fragments,它们将忽略您在onCreate()中设置的值,如果您覆盖getTheme()方法,它也将在片段中使用:
回答不同的问题:以编程方式更改活动的主题
@Override
public Resources.Theme getTheme() {
Resources.Theme theme = super.getTheme();
theme.applyStyle(R.style.c_2ecc71_BC6C2B, true);
return theme;
}
Run Code Online (Sandbox Code Playgroud)
在您的MainActivity或BasicActivity中使用它,具体取决于您希望将其应用到何处。您将不再需要在onCreate中进行更改。
不确定您是否真的想以编程方式设置它,但您可以尝试以下操作:How to setTheme to an Activity at Runtime? 在 onCreate 和 setContentView 之前调用 setTheme 不起作用
如果您希望为整个应用程序设置它,那么在 AndroidManifest.xml 文件中设置它可能会更容易/更干净。
<application android:theme="@style/CustomTheme">
Run Code Online (Sandbox Code Playgroud)
另外,我强烈避免使用包含值的样式名称。使用样式的目的是避免对值进行硬编码并允许它们可配置和可重用。如果你想改变 colorPrimary,你也要改变你的样式名称吗?
| 归档时间: |
|
| 查看次数: |
5042 次 |
| 最近记录: |