三行代碼實現白天夜間模式流暢切換的實現庫

来源:http://www.cnblogs.com/miaoqing/archive/2016/09/14/5870664.html
-Advertisement-
Play Games

Usage xml android:background= ?attr/zzbackground app:backgroundAttr= zzbackground //如果當前頁面要立即刷新,這裡傳入屬性名稱 比如R.attr.zzbackground 傳zzbackground即可 android ...


Usage xml android:background= ?attr/zzbackground app:backgroundAttr= zzbackground //如果當前頁面要立即刷新,這裡傳入屬性名稱 比如R.attr.zzbackground 傳zzbackground即可 android:textColor= ?attr/zztextColor app:textColorAttr= zztextColor //

演示效果

ChangeMode

Usage xml

    android:background="?attr/zzbackground"
    app:backgroundAttr="zzbackground"//如果當前頁面要立即刷新,這裡傳入屬性名稱  比如R.attr.zzbackground  傳zzbackground即可
    
    android:textColor="?attr/zztextColor"
    app:textColorAttr="zztextColor"//如需立即刷新頁面效果  同上

java

@Override
    protected void onCreate(Bundle savedInstanceState) {
            // 在要立即切換效果的頁面調用此方法
            ChangeModeController.getInstance().init(this,R.attr.class).setTheme(this, R.style.DayTheme, R.style.NightTheme);
            //在其他頁面調用此方法  
            //ChangeModeController.setTheme(this, R.style.DayTheme, R.style.NightTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //添加額外view至夜間管理
        // ChangeModeController.getInstance().addBackgroundColor(toolbar, R.attr.colorPrimary);
        //ChangeModeController.getInstance().addBackgroundDrawable(view,R.attr.colorAccent);
       // ChangeModeController.getInstance().addTextColor(view,R.attr.colorAccent);


       // 設置切換
       //ChangeModeController.changeDay(this, R.style.DayTheme);
       //ChangeModeController.changeNight(this, R.style.NightTheme);
    }
         
 @Override
    protected void onDestroy() {
        super.onDestroy();
        //   在onDestroy調用
        ChangeModeController.onDestory();
    }

詳細操作描述


第一步:自定義屬性

<?xml version="1.0" encoding="utf-8"?>
<resources>
                <attr name="zzbackground" format="color|reference"/>
                <attr name="zzbackgroundDrawable" format="reference"/>
                <attr name="zztextColor" format="color"/>
                <attr name="zzItemBackground" format="color"/>
</resources>

第二步:配置夜間style文件

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
       <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowNoTitle">true</item>
    </style>

    <!--日間模式 -->
    <style name="DayTheme" parent="AppTheme">
        <item name="zzbackground">@color/dayBackground</item>
        <item name="zzbackgroundDrawable">@drawable/ic_launcher</item>
        <item name="zztextColor">@color/dayTextColor</item>
        <item name="zzItemBackground">@color/dayItemBackground</item>
    </style>

    <!--夜間模式 -->
    <style name="NightTheme" parent="AppTheme">
        <item name="zzbackground">@color/nightBackground</item>
        <item name="zzbackgroundDrawable">@color/nightBackground</item>
        <item name="zztextColor">@color/nightTextColor</item>
        <item name="zzItemBackground">@color/nightItemBackground</item>

        <item name="colorPrimary">@color/colorPrimaryNight</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDarkNight</item>
        <item name="colorAccent">@color/colorAccentNight</item>
    </style>


    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>

為相關屬性設置對應模式的屬性值:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="dayBackground">#F2F4F7</color>
    <color name="dayTextColor">#000</color>
    <color name="dayItemBackground">#fff</color>

    <color name="nightItemBackground">#37474F</color>
    <color name="nightBackground">#263238</color>
    <color name="nightTextColor">#fff</color>
</resources>

第三步:在佈局文件中配置使用對應屬性

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:background="?attr/zzbackground"
    app:backgroundAttr="zzbackground"
    tools:context="com.thinkfreely.changemode.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:theme="@style/AppTheme.AppBarOverlay">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:backgroundAttr="colorPrimary"
            app:titleTextColor="?attr/zztextColor"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            />
    </android.support.design.widget.AppBarLayout>

        <Button
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:gravity="center"
            android:textColor="?attr/zztextColor"
            app:textColorAttr="zztextColor"
            android:background="?attr/zzItemBackground"
            app:backgroundAttr="zzItemBackground"
            android:padding="10dp"
            android:layout_marginBottom="8dp"
            android:textSize="22sp"
            android:textAllCaps="false"
            android:text="夜間模式切換by Mr.Zk" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"/>
</LinearLayout>

註意textColorAttr、backgroundAttr、backgroundDrawableAttr三個屬性。如需當前頁面立即刷新,需填加相應屬性。

屬性描述
textColorAttr 修改字體顏色時設置。如R.attr.zztextColor 傳zztextColor 即可。例:app:textColorAttr="zztextColor"
backgroundAttr 修改背景顏色/背景圖片時設置。同上。例: app:backgroundAttr="zzbackground"
backgroundDrawableAttr 修改背景顏色/背景圖片時設置。同上。例: app:backgroundDrawableAttr="zzbackground"

第四步:頁面調用java代碼

@Override
    protected void onCreate(Bundle savedInstanceState) {
            //1. 在要立即切換效果的頁面調用此方法
            ChangeModeController.getInstance().init(this,R.attr.class).setTheme(this, R.style.DayTheme, R.style.NightTheme);
            //在其他頁面調用此方法  
            //ChangeModeController.setTheme(this, R.style.DayTheme, R.style.NightTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       //2.設置切換夜間活日間模式
       //ChangeModeController.changeDay(this, R.style.DayTheme);//切換日間模式
       //ChangeModeController.changeNight(this, R.style.NightTheme);//切換夜間模式
    }
 @Override
    protected void onDestroy() {
        super.onDestroy();
        //3.   在onDestroy調用
        ChangeModeController.onDestory();
    }

代碼調用三步,即可開始夜間之旅。
如果頁面有新創建的視圖要加入夜間模式控制,安卓源碼調用:

         //添加額外view至夜間管理
        // ChangeModeController.getInstance().addBackgroundColor(toolbar, R.attr.colorPrimary);
        //ChangeModeController.getInstance().addBackgroundDrawable(view,R.attr.colorAccent);
       // ChangeModeController.getInstance().addTextColor(view,R.attr.colorAccent);

如果在改變夜間模式時有其他非標准定義的屬性時,可在ChangeModeController.changeDay或ChangeModeController.changeNight之後調用如下代碼給相關屬性賦值:

   TypedValue  attrTypedValue = ChangeModeController.getAttrTypedValue(this, R.attr.zztextColor);
   toolbar.setTitleTextColor(getResources().getColor(attrTypedValue.resourceId));

源碼下載地址:http://www.codesocang.com/kj/transition/33588.html

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前看到一篇文章介紹到App之間的五種通信方式,它分別有URL Scheme,Keychain,UIPastedboard,UIDocumentInteractionController以及利用socket進行本地通信。前面4種都有用到過,也相對比較簡單,幾行代碼的事。對於最後一種之前一直沒用到過( ...
  • 當做一款APP,需要選擇本地圖片時,首先考慮的無疑是系統相冊,但是Android手機五花八門,再者手機像素的提升,大圖無法返回等異常因數,導致適配機型比較困難,微信、QQ都相繼的在自己的APP里集成了圖片選擇功能,放棄了系統提供的圖片選擇器,這裡仿造QQ做了一個本地圖片選擇器,PS:之前有人說"仿" ...
  • iOS10相冊相機閃退bughttp://www.jianshu.com/p/5085430b029fiOS 10 因蘋果健康導致閃退 crashhttp://www.jianshu.com/p/545bd1bf5a23麥克風、多媒體、地圖、通訊錄ios10相機等崩潰http://www.jians ...
  • swift字典 在swift中,key:key值一定是可hash的,一定是獨一無二的,swift的基本數據類型(String,Int,Float)都是可哈希的,所以都可以作為key值。 value:沒有要求 直接上代碼了,註釋給大家標的很明白 //創建字典並賦值 let dict = ["name" ...
  • 博客: Android 6.0 運行時許可權管理最佳實踐 github: https://github.com/yanzhenjie/AndPermission ...
  • EventBus是最近項目用到的,也只是會些簡單的功能,不過感覺功能蠻強大的。代碼鏈接:http://download.csdn.net/detail/qq_29774291/9629346 EventBus是Guava的事件處理機制,是設計模式中的觀察者模式(生產/消費者編程模型)的優雅實現。主要 ...
  • 1、基本概念 2、創建 3、插入 4、查詢 5、封裝 6、model 7、界面顯示 存數據 ...
  • Animation 效果 用法 1.非常簡單,導入兩個文件(UIView+SetRect) (UIView+ImageEffects) 源碼 github源碼:https://github.com/makingitbest/Animation 細節 1.下圖是效果圖的全部代碼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...