iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android:主题切换
  • 116
分享到

Android:主题切换

android 2023-09-03 13:09:32 116人浏览 独家记忆
摘要

一.概述 正在开发的应用做了一版新UI,原打算将新版UI按项目名做成资源包,再在build.gradle里productFlavors{ }多渠道打包实现 但被告知新旧两个项目共用一个分支,那就做成两个主题(Theme1/Theme2)来适

一.概述

正在开发的应用做了一版新UI,原打算将新版UI按项目名做成资源包,再在build.gradle里productFlavors{ }多渠道打包实现

但被告知新旧两个项目共用一个分支,那就做成两个主题(Theme1/Theme2)来适配了

如果只是变更UI,做成多主题来适配不同项目也是比较合适的方式

一.Android App实现多主题的主要有如下几种:

  1. 服务器下载或提前放置不同主题资源包到设备指定目录,在代码里引用主题资源
  2. 定义不同的

各属性的具体值可以在Theme定义时配置,但是最好定义在各自的xml配置文件中(color.xml、string.xml、dimens.xml.....),然后在Theme定义时"@类型/..."格式引用

Theme中如果string类型不是引用而是字符串,在布局文件中使用正常,但代码里获取会有问题

2.3 布局文件中引用属性

使用过程也很简单,原本布局文件中引用UI属性的方式如下:

android:color="@color/colorAttrName"android:duration="@integer/integerValue"android:adjustViewBounds="@bool/booleanAttrName" android:layout_height="@dimen/dimensionValue"android:text="@string/stringAttrName"android:background="@drawable/referenceAttrName"

现在改为这样进行引用:

android:color="?attr/colorAttrName"android:duration="?attr/integerValue"android:adjustViewBounds="?attr/booleanAttrName" android:layout_height="?attr/dimensionValue"android:text="?attr/stringAttrName"android:background="?attr/referenceAttrName"

float比较特殊,一般它会在代码中被引用(后面会讲到),配置文件中多在dimens.xml中定义变量

2.4 代码中切换主题

要配置的都配置好了,需要注意的是:

  • 最好写一个BaseActivity,其他的Activitiy都继承至它
  • 主题设置需要在setContentView()之前

接下来就在代码中进行主题切换:

package com.android.example.ui;import android.os.Bundle;import com.android.example.R;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;public class BaseActivity extends AppCompatActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (setThemeBlack) {            setTheme(R.style.ThemeBlack);        } else {            setTheme(R.style.ThemeLight);        }    }}

主题设置写在BaseActivity的onCreate()函数中,它会在其他所有继承至它的Activity的onCreate()之前运行。

2.5 代码中引用属性

如果要在代码中引用 integerValue、floatAttrName、booleanAttrName,使用Context.obtainStyledAttributes()就可以了

package com.android.example.ui;import android.os.Bundle;import com.android.example.R;import android.content.res.TypedArray;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;public class BaseActivity extends AppCompatActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (setThemeBlack) {            setTheme(R.style.ThemeBlack);        } else {            setTheme(R.style.ThemeLight);        }        TypedArray tyar = obtainStyledAttributes(new int[]{                R.attr.colorValue,                R.attr.integerValue,                R.attr.booleanValue,                R.attr.dimensionValue,                R.attr.floatValue,                R.attr.stringValue,                R.attr.referenceValue        });        int colorArrtValue = tyar.getColor(0, Color.BLACK);        int integerArrtValue = tyar.getInt(1, Integer.MAX_VALUE);        boolean booleanArrtValue = tyar.getBoolean(2, false);        float dimensionArrtValue = tyar.getDimensionPixelSize(3, 66);        float floatArrtValue = tyar.getFloat(4, 99.99f);        String stringArrtValue = tyar.getString(5);        Drawable drawableArrtValue = tyar.getDrawable(6);    }}

到此,通过setTheme()切换主题方式就讲述完毕了 

这种切换主题方式的优点是:不需要修改太多代码,大部分修改只要针对布局文件就行。

弊端就是:主题只能内置配置好,一旦程序发布后,应用支持的主题类型就固定了,要想增加更多主题,只能发布新的版本。

如果想要动态配置主题,可以使用前文中提到过第1、第3种主题切换方式。

就是接下来要讲的内容了

三.主题资源打包成Apk进行切换

Apk主题切换和第1种将主题包整体下载或提前放置的方案很像。

共同点是:都需要在代码中动态设置图片、文字、颜色等UI信息。

区别是:第1种方法需要自行编写资源解析的方法。而Apk主题切换,可以使用Android自带api

APK主题方案的基本思路是:

在Android中,所有的资源都是基于包的。资源以id进行标识,在同一个应用中,每个资源都有唯一标识。但在不同的应用中,可以有相同的id。

因此,只要获取到了其他应用的Context对象,就可以通过它的 getRsources() 获取到其绑定的资源对象。

然后,就可以使用 Resources 的 getXXX 方法获取字符串、颜色、dimension、图片等。

要想获取其他应用的Context对象,Android已经为我们提供好了接口:

android.content.ContextWrapper.createPackageContext(String packageName, int flags)

package com.android.example.ui;import android.os.Bundle;import androidx.annotation.Nullable;public class MainActivity extends BaseActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView text = (TextView) findViewById(R.id.remoteText);        TextView color = (TextView) findViewById(R.id.remoteColor);        ImageView image = (ImageView) findViewById(R.id.remote_image);        try {            //主题资源Apk包名            String remotePackage = "com.xxx.themepackage";            //主题资源Apk Context            Context remoteContext = createPackageContext(remotePackage,CONTEXT_IGNORE_SECURITY);            //主题资源Apk Resources            Resources remoteResources = remoteContext.getResources();            text.setText(remoteResources.getText(remoteResources.getIdentifier("application_name", "string", remotePackage)));            color.setTextColor(remoteResources.getColor(remoteResources.getIdentifier("delete_target_hover_tint", "color", remotePackage)));            image.setImageDrawable(remoteResources.getDrawable(remoteResources.getIdentifier("ic_launcher_home", "drawable", remotePackage)));        } catch (NameNotFoundException e) {            e.printStackTrace();        }    }}

四.综述

3.高级应用

内置主题实现简单、配置方便,但可扩展性不强。

Apk切换主题扩展性高,但要在代码里设置所有可变资源,一旦界面布局改变,需要较长时间进行代码改写。

实际运用中,可以将以上两种结合起来使用:

涉及到界面风格,如整体色调、不同的文字颜色,使用内置主题。图片资源则在APK主题包中提供。

来源地址:https://blog.csdn.net/geyichongchujianghu/article/details/131024109

--结束END--

本文标题: Android:主题切换

本文链接: https://www.lsjlt.com/news/392281.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android:主题切换
    一.概述 正在开发的应用做了一版新UI,原打算将新版UI按项目名做成资源包,再在build.gradle里productFlavors{ }多渠道打包实现 但被告知新旧两个项目共用一个分支,那就做成两个主题(Theme1/Theme2)来适...
    99+
    2023-09-03
    android
  • 使用vue-antd动态切换主题
    目录vue-antd动态切换主题安装依赖Vue3.0 + Antd,修改antd主题色,配置全局cssvue-antd动态切换主题 安装依赖 1 webpack-theme-colo...
    99+
    2024-04-02
  • android槽位切换
    这里写自定义目录标题 手动切换android槽位 a槽位 b槽位1. 进入 fastboot2. 重启进入fastboot3. 切换4. 查看 手动切换android槽位 a槽位 b槽...
    99+
    2023-10-23
    android java adb android studio
  • 使用vue怎么实现主题切换
    这篇文章给大家介绍使用vue怎么实现主题切换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。第一种办法:动态组件当主题的路由并没有发生变化,仅是组件内部的样式,功能发生了变化,我们可以将一个组件复制一遍,修改完后,通过懒...
    99+
    2023-06-15
  • 基于Css Variable的主题切换示例
    小编给大家分享一下基于Css Variable的主题切换示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!当接到这个需求的时候,百度到业界关于主题切换的方案还挺多...
    99+
    2023-06-08
  • 利用JetpackCompose实现主题切换功能
    目录前言color.ktTheme.kt关于compositionLocalOf完整代码前言 新建的Compose项目默认的 Material 主题为我们提供了一...
    99+
    2024-04-02
  • vue+element-ui实现主题切换功能
    element-ui提供了自定义主题 自定义主题 一、安装 npm i element-theme -gnpm i element-theme-chalk -Dnpm i https...
    99+
    2024-04-02
  • android fragment怎么切换
    要在Android Fragment之间进行切换,可以通过以下几种方法:1. 使用FragmentManager和FragmentT...
    99+
    2023-10-20
    android
  • 怎么简单实现CSS主题的切换
    这篇文章给大家分享的是有关怎么简单实现CSS主题的切换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。HTML首先,我们需要包含“按钮”,这些按钮将触发主题根据选择的主题进行切换。(注:你总是可以使这些作为 opt...
    99+
    2023-06-08
  • 解决redis sentinel 频繁主备切换的问题
    问题描述操作redis发现原有Master变成slave,其他slave成master,切换较频繁问题分析查看redis服务器sentinel日志,发现主机频繁在凌晨左右sentin...
    99+
    2024-04-02
  • Vue UI框架的主题切换功能实现
    目录AntD 的方式1. 创建黑暗主题文件2. 创建切换主题的函数3. 切换主题Quasar 的方式ElementUI 的方式NaiveUI 的方式在如今,很多网页已经可以手动切换明...
    99+
    2022-12-08
    vue主题切换 vue ui框架主题切换
  • WinForm中怎么实现主题和皮肤切换
    在WinForm中实现主题和皮肤切换通常可以通过以下步骤来实现: 创建多个不同主题或皮肤的样式文件,比如XML文件或INI文件等,...
    99+
    2024-04-08
    winform
  • 怎么切换MySQL主从
    本篇内容介绍了“怎么切换MySQL主从”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、在主库上把热数据立...
    99+
    2024-04-02
  • mysql主从搭建切换
    环境: 172.30.249.156 percona5.6.27 主机名:tr-mysql 跑着生产环境的应用的虚拟机 192.168.129.153 percona5...
    99+
    2024-04-02
  • Vue怎么使用Less与Scss实现主题切换
    这篇文章主要介绍“Vue怎么使用Less与Scss实现主题切换”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue怎么使用Less与Scss实现主题切换”文章能帮助大家解决问题。一、Less/Scs...
    99+
    2023-07-05
  • Android如何实现切换imageView
    小编给大家分享一下Android如何实现切换imageView,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:最近在做五子棋的界面的时候,需要有一块区域动...
    99+
    2023-05-30
    android imageview
  • android fragment切换怎么设置
    要在Android中切换Fragment,可以通过以下几个步骤来设置:1. 在XML布局文件中定义一个Fragment容器,例如一个...
    99+
    2023-09-26
    android
  • vue实现主题切换的多种思路分享
    目录动态改变主题 第一种办法:动态组件 第二种办法,路由隔离 总结 额外补充基于css的两种方法方法一 多套css方法二 scss动态切换变量 动态改变主题 首先需要解决的是如何知...
    99+
    2024-04-02
  • Vue项目如何实现切换主题色思路
    目录Vue项目切换主题色思路需求实现效果实现思路总结Vue项目切换主题色思路 需求 用户通过取色器选择自己喜欢的颜色,替换项目中的主题色 实现效果 实现思路 在项目中使用的是les...
    99+
    2023-01-13
    Vue主题色 Vue切换主题色 Vue主题色切换
  • android fragment切换如何设置
    要设置Android Fragment的切换,可以使用FragmentTransaction类的方法来完成:1. 获取Fragmen...
    99+
    2023-08-26
    android fragment
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作