android - 如何为 Activity 切换主题

标签 android android-layout android-theme android-styles

情况是这样的:

  1. 我有 DogActivityFavoritesActivityDogActivity 只是一个 ListView。当您单击列表中的 Dog 时,它会将您带到 FavoritesActivity
  2. 我想准备一些主题。它们不需要动态生成。它们可以已经以 XML 形式存在。
  3. 根据用户从列表中选择的狗,我希望在我预先存在的主题之一中显示 FavoritesActivity

我听到有关 ContextWrapper 的讨论,但我不确定如何应用它。关于如何实现此目标的任何想法?

详细信息:

这是通常的单一主题:

对于 v21/styles.xml

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:colorControlHighlight">@color/colorAccentLight</item>
        <item name="android:colorControlNormal">@color/colorAccent</item>
        <item name="android:itemTextAppearance">@style/AppTheme.itemTextStyle</item>
        <item name="popupMenuStyle">@style/PopupMenu.MyAppTheme</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:colorControlHighlight">@color/colorAccentLight</item>
    </style>

    <style name="AppTheme.itemTextStyle" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
        <item name="android:textColor">@color/colorPrimary</item>
    </style>
</resources>

对于 styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

我想做的事:

本质上,我只想即时更改 colorPrimarycolorPrimaryDarkcolorAccent,并拥有所有样式和主题以及 XML 布局用它们来改变。因此,如果我可以在启动 FavoritesActivity 之前更改这些颜色,那么这将解决我的问题。

最佳答案

您可以只将狗类型作为 Intent extra 发送,然后使用 setTheme() 方法设置适当的 Theme。

对于这个例子,假设您只有两个主题:

<style name="AppThemeOne" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppThemeTwo" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimaryCustom</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDarkCustom</item>
    <item name="colorAccent">@color/colorAccentCustom</item>
</style>

然后,在 DogActivity 中,将 Intent Extra 设置为用户从 ListView 中选择的 Dog 类型:

Intent intent = new Intent(DogActivity.this, FavoritesActivity.class);
intent.putExtra("dog_type", "terrier");
startActivity(intent);

然后,在 FavoritesActivity 中,加载正确的主题:

@Override
protected void onCreate(Bundle savedInstanceState) {

    String dogType = getIntent().getStringExtra("dog_type");
    if (dogType.equals("terrier")) {
        setTheme(R.style.AppThemeOne);
    } else {
        setTheme(R.style.AppThemeTwo);
    }
    super.onCreate(savedInstanceState);
    setContentView(R.layout.favorites_layout);
    //.....
 }

关于android - 如何为 Activity 切换主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39356604/

相关文章:

android - Visual Studio 多设备混合应用程序如何向 AndroidManifest.xml 添加使用权限

Android 约束布局无法按预期工作

按钮不适用的Android主题样式

android - 对话框主题动画问题

安卓 XML : Set Resource id as View's tag in XML layout file

android - API 级别低于 21 的状态栏颜色没有改变

android - 如何放大 Highcharts Android

每次 ScrollView 时,Android 将图像从 url 加载到 listView 中

java - 如何并行连续递增多个 RecyclerView 值

android - 在 Android 中显示进度对话框