setTheme不改变主题颜色

Max*_*Max 13 android themes

我知道几次问过这个问题.但我无法在我的案例中找到问题.我想改变应用程序的主题,但我的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);

谢谢!

BMU*_*BMU 5

您正在尝试扩展 Android 的较新主题之一(API 21 以上)。除了上面的所有答案,您还可以将您的主题放在styles.xml(v21) 中。

更多信息在这里https://developer.android.com/training/material/compatibility.html在此处输入图片说明


Bjö*_*hel 5

如果您使用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中进行更改。


Sco*_*itt 2

不确定您是否真的想以编程方式设置它,但您可以尝试以下操作: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 次

最近记录:

9 年,7 月 前