Android 混合開發實戰:統一 View 與 Compose 的淺色/深色主題方案

整個應用(包括 View 和 Compose 部分)的淺色/深色模式保持一致。以下是完整的解決方案:

全局配置方案

1. 基礎主題設置

res/values/themes.xmlres/values-night/themes.xml 中定義統一的主題

<!-- values/themes.xml -->
<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight"><!-- 淺色主題顏色 --><item name="colorPrimary">@color/purple_500</item><item name="colorPrimaryVariant">@color/purple_700</item><item name="colorSecondary">@color/teal_200</item>
</style><!-- values-night/themes.xml -->
<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight"><!-- 深色主題顏色 --><item name="colorPrimary">@color/purple_200</item><item name="colorPrimaryVariant">@color/purple_500</item><item name="colorSecondary">@color/teal_200</item>
</style>

2. Compose 主題適配器

創建 Compose 主題與 XML 主題的橋梁:

// Theme.kt
@Composable
fun MyAppTheme(darkTheme: Boolean = isSystemInDarkTheme(),content: @Composable () -> Unit
) {val context = LocalContext.currentval colors = if (darkTheme) {// 從 XML 資源獲取顏色val primaryColor = context.getColor(R.color.purple_200)val primaryVariantColor = context.getColor(R.color.purple_500)val secondaryColor = context.getColor(R.color.teal_200)darkColors(primary = Color(primaryColor),primaryVariant = Color(primaryVariantColor),secondary = Color(secondaryColor))} else {val primaryColor = context.getColor(R.color.purple_500)val primaryVariantColor = context.getColor(R.color.purple_700)val secondaryColor = context.getColor(R.color.teal_200)lightColors(primary = Color(primaryColor),primaryVariant = Color(primaryVariantColor),secondary = Color(secondaryColor))}MaterialTheme(colors = colors,typography = Typography,shapes = Shapes,content = content)
}

3. 全局主題切換控制

在 Application 類中統一管理主題:

class MyApp : Application() {override fun onCreate() {super.onCreate()// 設置默認主題模式AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)}companion object {fun setDarkMode(enabled: Boolean) {AppCompatDelegate.setDefaultNightMode(if (enabled) AppCompatDelegate.MODE_NIGHT_YESelse AppCompatDelegate.MODE_NIGHT_NO)}}
}

實際使用示例

傳統 View Activity

class LegacyActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 會自動應用 themes.xml 中定義的主題setContentView(R.layout.activity_legacy)}
}

Compose Activity

class ComposeActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {MyAppTheme {// 你的 Compose 內容Surface {Text("這是 Compose 界面")}}}}
}

遷移過程中的注意事項

  1. 混合 Activity 處理

    • 對于同時包含 View 和 Compose 的 Activity,使用 ComposeView 橋接
    <!-- activity_mixed.xml -->
    <LinearLayout><TextView android:text="傳統 View"/><androidx.compose.ui.platform.ComposeViewandroid:id="@+id/compose_view"android:layout_width="match_parent"android:layout_height="wrap_content"/>
    </LinearLayout>
    
  2. 顏色資源統一

    • 所有顏色定義在 res/values/colors.xmlres/values-night/colors.xml
    • Compose 通過 colorResource(id = R.color.your_color) 使用
  3. 主題切換同步

    • 使用 AppCompatDelegate.setDefaultNightMode() 切換時,所有 Activity 都會自動重建并應用新主題

通過這種方式,你可以確保項目中前期使用 View 的 Activity 和后期使用 Compose 的 Activity 在淺色/深色模式下保持完全一致的視覺風格。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80566.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT開發技術【QT實現桌面右下角消息】

一、效果 ![ 二、彈窗主體部分 noticewidget /* ** File name: NoticeWidget.h ** Author: ** Date: 2025-04-25 ** Brief: 通知欄控件 ** Copyright (C) 1392019713qq.com All rights reserved. */#include "../Include/NoticeWidget.h"…

在LiveGBS GB28181互聯網安防監控平臺中關于redis版本切換的方法說明

目錄 1、Redis服務2、如何切換REDIS? 2.1、停止啟動REDIS2.2、配置信令服務2.3、配置流媒體服務2.4、啟動3、搭建GB28181視頻直播平臺 1、Redis服務 在LivGBS中Redis作為數據交換、數據訂閱、數據發布的高速緩存服務。默認LiveCMS解壓目錄下會攜帶一個REDIS服務。如果已經有自…

vue3中的effectScope有什么作用,如何使用?如何自動清理

vue3中的effectScope有什么作用&#xff0c;如何使用?如何自動清理 vue3中的effectScope有什么作用&#xff0c;如何使用 官網介紹&#xff1a;作用特點簡單示例&#xff1a;自動清理示例 官網介紹&#xff1a; 創建一個 effect 作用域&#xff0c;可以捕獲其中所創建的響應…

搭建基于火災風險預測與防范的消防安全科普小程序

基于微信小程序的消防安全科普互動平臺的設計與實現&#xff0c;是關于微信小程序的&#xff0c;知識課程學習&#xff0c;包括學習后答題。 技術棧主要采用微信小程序云開發&#xff0c;有下面的模塊&#xff1a; 1.課程學習模塊 2.資訊模塊 3.答題模塊 4.我的模塊 還需…

python 與Redis操作整理

以下是使用 Python 操作 Redis 的完整整理&#xff0c;涵蓋基礎操作、高級功能及最佳實踐&#xff1a; 1. 安裝與連接 (1) 安裝庫 pip install redis(2) 基礎連接 import redis# 創建連接池&#xff08;推薦復用連接&#xff09; pool redis.ConnectionPool(hostlocalhost, …

什么時候使用Python 虛擬環境(venv)而不用conda

是的&#xff01;python3.9 -m venv rtdetr_env 是 Python 原生的虛擬環境&#xff08;venv&#xff09;&#xff0c;而 conda 是另一個流行的虛擬環境管理工具&#xff08;來自 Anaconda/Miniconda&#xff09;。下面我會詳細對比兩者的區別&#xff0c;并講解 venv 的基本用法…

ubuntu20.04安裝x11vnc遠程桌面

x11vnc是一個VNC服務器, 安裝后我們可以不依賴外部的顯示設備, 通過網絡遠程登錄ubuntu桌面。 安裝x11vnc sudo apt-get install x11vnc 設置VNC登錄密碼 sudo x11vnc -storepasswd /etc/x11vnc.pwd 設置x11vnc在開機時自動啟動 新建如下文件: sudo vi /lib/systemd/sys…

Maven的概念與初識Maven

目錄 一、Maven的概念 1. 什么是Maven 2. 項目構建&#xff1a;從代碼到部署的標準化流程 2.1 Maven構建生命周期 2.2 傳統構建 vs Maven構建 3. 依賴管理&#xff1a;解決“JAR地獄”的利器 3.1 依賴聲明 3.2 依賴傳遞與沖突解決 4. Maven倉庫&#xff1a;依賴的存儲…

Unity-Shader詳解-其二

前向渲染和延遲渲染 前向渲染和延遲渲染總的來說是我們的兩種主要的渲染方式。 我們在Unity的Project Settings中的Graphic界面能夠找到渲染隊列的設定&#xff1a; 我們也可以在Main Camera這里進行設置&#xff1a; 那這里我們首先介紹一下兩種渲染&#xff08;Forward R…

C++ 中 std::tuple 使用詳解

C 中 std::tuple 使用詳解 基本概念 std::tuple 是 C11 引入的模板類&#xff0c;用于打包任意數量、任意類型的值在一起。可看作是類型安全的變長結構體。 #include <tuple>std::tuple<int, std::string, double> t(42, "hello", 3.14);創建 tuple 的…

WebRTC基于網頁的視頻會議,手寫WebRTC流程(html)

WebRTC是web real-time communication網頁及時通信的縮寫&#xff0c;通過javascript就可以實現網頁會話&#xff0c;基于瀏覽器開發出來多媒體應用&#xff0c; 以下是手寫的WEBRTC調用本地攝像頭的html代碼&#xff0c;直接用瀏覽器打開&#xff0c;就可以使用 <!DOCTYPE…

MyBatis 官方子項目詳細說明及表格總結

MyBatis 官方子項目詳細說明及表格總結 1. 核心子項目說明 1.1 mybatis-3 GitHub 鏈接&#xff1a;https://github.com/mybatis/mybatis-3功能&#xff1a; MyBatis 核心框架的源碼&#xff0c;提供 SQL 映射、動態 SQL、緩存、事務管理等核心功能。主要功能&#xff1a; 支持…

【虛幻C++筆記】碰撞檢測

目錄 碰撞檢測參數詳情示例用法 碰撞檢測 顯示名稱中文名稱CSphere Trace By Channel按通道進行球體追蹤UKismetSystemLibrary::SphereTraceSingleSphere Trace By Profile按描述文件進行球體追蹤UKismetSystemLibrary::SphereTraceSingleByProfileSphere Trace For Objects針…

推論階梯——AI與思維模型【81】

一、定義 推論階梯思維模型是一種用于分析和理解人們如何從觀察到的事實,經過一系列的假設、推理和判斷,最終得出結論的思維過程的理論框架。它將這個過程比喻為一個階梯,每一步都建立在前一步的基礎上,逐漸形成一個完整的推論。這個模型幫助我們意識到在思考和決策過程中…

小剛說C語言刷題——1109加密四位數

1.題目描述 某軍事單位用 4位整數來傳遞信息&#xff0c;傳遞之前要求先對這個 4 位數進行加密。加密的方式是每一位都先加上 5然后對 10取余數&#xff0c;再將得到的新數顛倒過來。 例如&#xff1a;原數是 1379 &#xff0c;那么每位加 55對 10 取余數的結果為 6824 &…

云服務器和獨立服務器的區別在哪

在當今數字化的時代&#xff0c;服務器成為了支撐各種業務和應用的重要基石。而在服務器的領域中&#xff0c;云服務器和獨立服務器是兩個備受關注的選項。那么&#xff0c;它們到底有何區別呢&#xff1f; 首先&#xff0c;讓我們來聊聊成本。云服務器通常采用按需付費的模式…

【前端】【業務場景】【面試】在前端開發中,如何優化 SVG(可縮放矢量圖形)的性能,特別是在處理復雜圖形和動畫時

SVG?性能優化&#xff1a;循序漸進 4?步法 目標&#xff1a;先減負 → 再復用 → 后加速 → 最后按場景微調 ①?精簡—把包袱先丟掉 刪除無用元素 隱藏/被遮擋的 <path>、未引用的 <defs> 里漸變、濾鏡。 合并路徑 同填充色或描邊的路徑 ? SVGO / SVGOMG「Mer…

MySQL長事務的隱患:深入剖析與解決方案

MySQL長事務的隱患&#xff1a;深入剖析與解決方案 一、什么是長事務&#xff1f; 在數據庫系統中&#xff0c;長事務(Long Transaction)通常指執行時間超過預期或系統設定閾值的事務。對于MySQL而言&#xff0c;雖然沒有嚴格的時間定義&#xff0c;但一般認為執行時間超過數…

華為AR1200 telnet設置

華為路由配置TELNET登 &#x1f4fa; 啟動TELNET服務 在華為路由器上啟動TELNET服務&#xff0c;執行以下命令&#xff1a; telnet server enable &#x1f511; 配置AAA認證 進入AAA認證配置&#xff0c;創建一個路由器登錄帳號admin123&#xff0c;并設置密碼為huawei123&…

【Token系列】01 | Token不是詞:GPT如何切分語言的最小單元

文章目錄 01 | Token不是詞&#xff1a;GPT如何切分語言的最小單元&#xff1f;一、什么是 Token&#xff1f;二、Token 是怎么來的&#xff1f;——BPE算法原理BPE核心步驟&#xff1a; 三、為什么不直接用詞或字符&#xff1f;四、Token切分的實際影響五、中文Token的特殊性六…