当前位置: 首页 > 知识库问答 >
问题:

如何更新我的项目创建一个多主题应用程序

吉嘉珍
2023-03-14

我想做一个设置活动,让用户个性化应用的外观。在这项活动中,用户可以选择将应用程序保持在“光主题”(例如,白色背景和黑色文本)或“暗主题”,即光主题的相反颜色,以利于夜间使用。

怎么可能做到呢?

我正在考虑在xml中为每个主题创建不同的布局。

编辑

下面的图像是设置活动的示例,我想更改整个应用程序的外观,而不是单个活动。

共有3个答案

贺海
2023-03-14

也许这个答案可以帮助你解决这个问题https://stackoverflow.com/a/4673209/4858673

public class BaseActivity extends Activity {

    protected void onCreate(Bundle state) {
        super.onCreate(state);
        String theme = PreferenceManager.getDefaultSharedPreferences(this).getString("theme", "black");
        setTheme(getTheme(theme);
    }

    private int getTheme(String theme) {
        if (theme.equals("black") return R.style.ThemeBlack;
        if (theme.equals("white") return R.style.ThemeWhite;
        ...
        return android.R.style.Theme; // stub
    }
}

并从此基本活动扩展您的所有活动。如果要使用PreferencesActivity或PreferencesFragment,请将此代码放入您的实现中,以便您只能扩展一个类 - Activity(AppCompatActivity)或PreferencesActivity

附言R.style.ThemeBlack是您在styles.xml的主题设置

<style name="ThemeBlack" parent="android:Theme.Holo">
</style>
鲁羽
2023-03-14

你可以创建自己的主题,然后当用户想要更改它们时,你可以将此代码添加到你的活动中,你可以选择所需的任何主题,而不仅仅是 Holo。

< i> getApplication()。setTheme(主题。赫萝)

云霖
2023-03-14

这就是我为我的应用程序所做的。我相信我的方法会有所帮助。

在styles.xml中设置你的光明和黑暗主题,如下所示:

     <!-- Use this theme in Manifest by default -->
    <style name="MyLightTheme" parent="Base.AppTheme.Light"></style>
    
    <!-- Base light theme containing all styles -->
    <style name="Base.AppTheme.Light" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        ... Other styles
    </style>

    <!-- Use this to switch to Dark theme -->
    <style name="MyDarkTheme" parent="Base.AppTheme.Dark"></style>

    <!-- Base dark theme containing all styles -->
    <style name="Base.AppTheme.Dark" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        ... Other styles
    </style>

因为您是通过一个首选项来控制主题更改的,所以在PreferenceFragment中注册一个首选项更改侦听器。

PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this);

实现对共享的首选项更改():

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

        if (key.equals(getString(R.string.pref_key_nighttheme))) {

            if (sharedPreferences.getBoolean(getString(R.string.pref_key_nighttheme), false)) {
                //  Night theme enabled

                getActivity().setTheme(R.style.MyDarkTheme);  
                       getActivity().getApplication().setTheme(R.style.MyDarkTheme);
               darkTheme = true;

            } else {
                getActivity().setTheme(R.style.MyLightTheme);
                getActivity().getApplication().setTheme(R.style.MyLightTheme);
               darkTheme = false;
            }

            getActivity().recreate(); // This is important. It allows the theme change to take effect.
        } 
    }

如果后退导航导致MainActivity,请确保在onResume()中重新创建MainActivity。

此外,在onCreate()中调用super()之前,必须检查每个活动中的当前主题。

  isThemeDark = setDarkTheme(this);

setDarkTheme()是我创建的一个助手,它通过SharedPreference检查当前主题。它检查是否有必要改变主题。

    public static boolean setDarkTheme(Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

    boolean isDarkTheme = prefs.getBoolean(context.getString(R.string.pref_key_nighttheme), false);
    context.setTheme(SettingsActivity.darkTheme ? R.style.MyDarkTheme : R.style.MyLightTheme);

    return isDarkTheme;
}

以下是我的应用程序Newslet中的夜间模式的工作原理:

更新:Android现在通过其AppCompat DayNight主题正式支持夜间模式。这里有一个相同的教程。

 类似资料:
  • 如果你已经使用过Android Studio和Gradle,那么这一章会比较简单。我不会给出很多细节和截图,因为用户界面和细节可能会一直变化。 我们的应用是由一个简单的天气app组成,正如所使用的Google’s Beginners Course in Udacity。我们可能会关注不同的事情,但是app的想法都是一样的,你会发现在一个典型的app里面会包括很多不同的东西。如果你的Android开

  • It doesn’t matter if you have an existing repository/directory of code, or if you are starting a completely new project, adding Yarn works the same way every time. In your terminal/console in the dire

  • 首先,打开Android Studio并选择Create new Project,然后它会让你输入一个名字,你可以任意取一个名字,比如:Weather App。然后你需要输入公司域名。如果你不会真正发布这个app,这个字段就不是特别重要了,但是如果你有的话可以使用自己的域名。然后任意选择一个目录作为这个项目的保存地址。 下一步,它会让你选择最小的API版本。我们选择API 15,因为我们有一个库需

  • 我无法得到为什么appcompat_v7是自动创建的…发现它很烦人…请有人帮助摆脱这个问题。我试图创建新项目,发现每个新创建的项目都是这样的。

  • 第 1 步,创建项目 要创建一个新项目,可以依次点击菜单 【File】→【New...】→【Projects】,你可以创建下列几种项目类型: Qt4 Console Application – 控制台应用程序 Qt4 Gui Application – GUI 应用程序(主要是含有界面布局的类型) C++ Library – C++库 这里我们创建一个基于 Qt4 Gui Application

  • 本文向大家介绍clojure 创建一个新的应用程序,包括了clojure 创建一个新的应用程序的使用技巧和注意事项,需要的朋友参考一下 示例 按照上述说明并安装Leiningen后,请运行以下命令来启动新项目: 这将使用该<project-name>文件夹中的默认Leiningen模板设置一个Clojure项目。莱宁根有多个模板,这些模板会影响项目的结构。最常见的是使用的模板“ app”,它添加了