android動態改變菜單欄,Android動態設置主題(使用RxBus模式)

之前寫過一篇文章:RxBus的實現及簡單使用。今天我們嘗試使用RxBus動態切換主題。

一、定義主題顏色

color.xml

#F44336

#D32F2F

#F44336

#E91E63

#C2185B

#E91E63

#795548

#5D4037

#795548

#2196F3

#1976D2

#2196F3

#607D8B

#455A64

#607D8B

#FFEB3B

#FBC02D

#FFEB3B

#673AB7

#512DA8

#673AB7

#4CAF50

#388E3C

#4CAF50

#FF5722

#E64A19

#FF5722

#9E9E9E

#616161

#9E9E9E

#00BCD4

#0097A7

#00BCD4

#FFC107

#FFA000

#FFC107

#2196F3

#1E88E5

@color/primary

二、定義主題樣式

styles.xml

@color/red_primary

@color/red_primary_dark

@color/red_accent

@color/pink_primary

@color/pink_primary_dark

@color/pink_accent

@color/brown_primary

@color/brown_primary_dark

@color/brown_accent

@color/blue_primary

@color/blue_primary_dark

@color/blue_accent

@color/blue_grey_primary

@color/blue_grey_primary_dark

@color/blue_grey_accent

@color/yellow_primary

@color/yellow_primary_dark

@color/yellow_accent

@color/deep_purple_primary

@color/deep_purple_primary_dark

@color/deep_purple_accent

@color/green_primary

@color/green_primary_dark

@color/green_accent

@color/deep_orange_primary

@color/deep_orange_primary_dark

@color/deep_orange_accent

@color/grey_primary

@color/grey_primary_dark

@color/grey_accent

@color/cyan_primary

@color/cyan_primary_dark

@color/cyan_accent

@color/amber_primary

@color/amber_primary_dark

@color/amber_accent

三、在需要的地方彈出主題選擇對話框

private void showThemeChooseDialog() {

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

builder.setTitle("設置主題");

Integer[] res = new Integer[]{R.drawable.red_round, R.drawable.brown_round, R.drawable.blue_round,

R.drawable.blue_grey_round, R.drawable.yellow_round, R.drawable.deep_purple_round,

R.drawable.pink_round, R.drawable.green_round, R.drawable.deep_orange_round,

R.drawable.grey_round, R.drawable.cyan_round};

List list = Arrays.asList(res);

ColorsListAdapter adapter = new ColorsListAdapter(MainActivity.this, list);

adapter.setCheckItem(MyThemeUtils.getCurrentTheme(MainActivity.this).getIntValue());

GridView gridView = (GridView) LayoutInflater.from(MainActivity.this).inflate(R.layout.colors_panel_layout, null);

gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);

gridView.setCacheColorHint(0);

gridView.setAdapter(adapter);

builder.setView(gridView);

final AlertDialog dialog = builder.show();

gridView.setOnItemClickListener(

new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

dialog.dismiss();

int value = MyThemeUtils.getCurrentTheme(MainActivity.this).getIntValue();

if (value != position) {

PreferenceUtils.getInstance(MainActivity.this).saveParam("change_theme_key", position);

changeTheme(MyThemeUtils.Theme.mapValueToTheme(position));

}

}

}

);

}

對話框圓形顏色選項

在drawable下新建red_round.xml,其他主題顏色類似

四、ColorsListAdapter、colors_image_layout.xml,主題選擇框中顏色適配器及其xml

ColorsListAdapter

public class ColorsListAdapter extends BaseAdapter {

private int checkItem;

Context context;

List list;

public ColorsListAdapter(Context context, List list) {

this.context = context;

this.list = list;

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object getItem(int position) {

return list.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

Holder holder;

if (convertView == null) {

convertView = LayoutInflater.from(context).inflate(R.layout.colors_image_layout, null);

holder = new Holder();

holder.imageView1 = (ImageView) convertView.findViewById(R.id.img_1);

holder.imageView2 = (ImageView) convertView.findViewById(R.id.img_2);

convertView.setTag(holder);

} else {

holder = (Holder) convertView.getTag();

}

holder.imageView1.setImageResource(list.get(position));

if (checkItem == position) {

holder.imageView2.setImageResource(R.drawable.ic_done_white);

}

return convertView;

}

public void setCheckItem(int checkItem) {

this.checkItem = checkItem;

}

static class Holder {

ImageView imageView1;

ImageView imageView2;

}

}

colors_image_layout.xml

android:background="@android:color/transparent"

android:orientation="vertical"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:id="@+id/img_1"

android:layout_gravity="center"

android:layout_width="40dp"

android:layout_height="40dp" />

android:id="@+id/img_2"

android:layout_gravity="center"

android:layout_width="20dp"

android:layout_height="20dp" />

五、使用RxBus發布事件和處理事件

發布

private void changeTheme(MyThemeUtils.Theme theme) {

RxBus.getInstance().post(new RxbusEvent(theme));

}

接收

rxSbscription=RxBus.getInstance().toObserverable(RxbusEvent.class)

.subscribe(new Action1() {

@Override

public void call(RxbusEvent rxbusEvent) {

changeTheme(rxbusEvent.getTheme());

}

});

六、用到的工具類

PreferenceUtils

public class PreferenceUtils {

private SharedPreferences sharedPreferences;

private SharedPreferences.Editor shareEditor;

private static PreferenceUtils preferenceUtils = null;

public static final String NOTE_TYPE_KEY = "NOTE_TYPE_KEY";

public static final String EVERNOTE_ACCOUNT_KEY = "EVERNOTE_ACCOUNT_KEY";

public static final String EVERNOTE_NOTEBOOK_GUID_KEY = "EVERNOTE_NOTEBOOK_GUID_KEY";

private PreferenceUtils(Context context){

sharedPreferences = context.getSharedPreferences("ThemeSetting", Context.MODE_PRIVATE);

shareEditor = sharedPreferences.edit();

}

public static PreferenceUtils getInstance(Context context){

if (preferenceUtils == null) {

synchronized (PreferenceUtils.class) {

if (preferenceUtils == null) {

preferenceUtils = new PreferenceUtils(context.getApplicationContext());

}

}

}

return preferenceUtils;

}

public String getStringParam(String key){

return getStringParam(key, "");

}

public String getStringParam(String key, String defaultString){

return sharedPreferences.getString(key, defaultString);

}

public void saveParam(String key, String value)

{

shareEditor.putString(key,value).commit();

}

public boolean getBooleanParam(String key){

return getBooleanParam(key, false);

}

public boolean getBooleanParam(String key, boolean defaultBool){

return sharedPreferences.getBoolean(key, defaultBool);

}

public void saveParam(String key, boolean value){

shareEditor.putBoolean(key, value).commit();

}

public int getIntParam(String key){

return getIntParam(key, 0);

}

public int getIntParam(String key, int defaultInt){

return sharedPreferences.getInt(key, defaultInt);

}

public void saveParam(String key, int value){

shareEditor.putInt(key, value).commit();

}

public long getLongParam(String key){

return getLongParam(key, 0);

}

public long getLongParam(String key, long defaultInt){

return sharedPreferences.getLong(key, defaultInt);

}

public void saveParam(String key, long value){

shareEditor.putLong(key, value).commit();

}

public void removeKey(String key){

shareEditor.remove(key).commit();

}

}

MyThemeUtils

public class MyThemeUtils {

public static void changTheme(Activity activity, Theme theme) {

if (activity == null)

return;

int style = R.style.RedTheme;

switch (theme) {

case BROWN:

style = R.style.BrownTheme;

break;

case BLUE:

style = R.style.BlueTheme;

break;

case BLUE_GREY:

style = R.style.BlueGreyTheme;

break;

case YELLOW:

style = R.style.YellowTheme;

break;

case DEEP_PURPLE:

style = R.style.DeepPurpleTheme;

break;

case PINK:

style = R.style.PinkTheme;

break;

case GREEN:

style = R.style.GreenTheme;

break;

case DEEP_ORANGE:

style = R.style.DeepOrangeTheme;

break;

case GREY:

style = R.style.GreyTheme;

break;

case CYAN:

style = R.style.CyanTheme;

break;

case AMBER:

style = R.style.AmberTheme;

break;

default:

break;

}

activity.setTheme(style);

}

public static Theme getCurrentTheme(Context context) {

int value = PreferenceUtils.getInstance(context)

.getIntParam("change_theme_key", 0);

return MyThemeUtils.Theme.mapValueToTheme(value);

}

public enum Theme {

RED(0),

BROWN(1),

BLUE(2),

BLUE_GREY(3),

YELLOW(4),

DEEP_PURPLE(5),

PINK(6),

GREEN(7),

DEEP_ORANGE(8),

GREY(9),

CYAN(10),

AMBER(11);

private int mValue;

Theme(int value) {

this.mValue = value;

}

public static Theme mapValueToTheme(final int value) {

for (Theme theme : Theme.values()) {

if (value == theme.getIntValue()) {

return theme;

}

}

// If run here, return default

return RED;

}

static Theme getDefault() {

return RED;

}

public int getIntValue() {

return mValue;

}

}

}

基類BaseActivity,主題的初始化。注意,需要變換主題的Activity需繼承BaseActivity

public class BaseActivity extends AppCompatActivity {

protected PreferenceUtils preferenceUtils;

@Override

protected void onCreate(Bundle savedInstanceState) {

preferenceUtils = PreferenceUtils.getInstance(this);

initTheme();

super.onCreate(savedInstanceState);

}

private void initTheme() {

MyThemeUtils.Theme theme = MyThemeUtils.getCurrentTheme(this);

MyThemeUtils.changTheme(this, theme);

}

}

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

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

相關文章

android 圖片分析,Android圖片處理實例分析

本文實例講述了Android圖片處理的方法。分享給大家供大家參考,具體如下:package cn.szbw.util;import Android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.…

android開發按鈕顏色,Android編程實現簡單設置按鈕顏色的方法

本文實例講述了Android編程實現簡單設置按鈕顏色的方法。分享給大家供大家參考,具體如下:1.工程目錄a.在res目錄-新建drawble文件夾放入自定義圖片2.main.xmlandroid:orientation"vertical"android:layout_width"fill_parent"androi…

艾默生變頻器ev1000故障代碼_國產變頻器型號大全,梳理國產變頻的前世今生!...

在工控領域,變頻器已經廣為所知且應用范圍廣泛,各方對變頻器能給出形形色色的描述。維基百科給出的定義:“變頻器(variable frequency drive,常見縮寫VFD),也稱為變頻驅動器或驅動控制器。變頻器是可調速驅動系統的一種…

android音樂播放器案例,Android MediaPlayer實現音樂播放器實例代碼

Android MediaPlayer實現音樂播放器1、布局文件android:layout_width"fill_parent"android:layout_height"fill_parent"android:orientation"vertical" >android:id"id/hint"android:layout_width"wrap_content"android:…

單邊指數信號的特點_今日股市分析:上證指數若能守住3400,蓄力反彈就有戲...

昨日整體概況上漲:848只 下跌:3009只漲停:69只 跌停:12只昨天的上證指數低開低走,午后沖紅又回落,另一邊的創業板卻是單邊下行跌超3%,板塊方向農業、洪水概念股、還有電力板塊較強。按照昨日置頂…

萬豐科技機器人排名_機器人系統集成“7宗最”

摘要:對于眾多集成商而言,作為典型的“夾心餅奧利奧”,面對客戶的各種要求,“不敢勉強你,只好為難自己”系真實寫照。1、企業數量最多GGII統計數據顯示,截至2019年年底,中國工業機器人產業企業數…

android 電池高溫關機,Android 關機問題分析指南

本篇文章主要介紹 Android 開發中的 關機 部分知識點,通過閱讀本篇文章,您將收獲以下內容:1 . 確認是亮屏關機還是滅屏關機?關機時是否有播放關機動畫?2 . 是直接關機還是關機后會自動重啟?3.異常關機時,連…

android switch 未定義,在switch語句中初始化時未定義的變量?

問題本身就是一個明顯的答案.無論如何,這是我的代碼片段......switch(cSet)...case 8:{ //Special CharactersfinalSet special;char* charSet new char[special.size() 1];charSet[special.size()] 0; //Append null terminatormemcpy(charSet, special.c_str(), special.…

android 克隆對象,克隆會破壞單例對象嗎?

假設有這樣一個場景,如果復制的目標對象恰好是單例對象,那會不會破壞單例對象呢?當然,我們在已知的情況下肯定不會這么干,但如果發生了意外怎么辦?不防來修改一下代碼。public class ConcretePrototype imp…

轉網口顯示未識別的網絡_已有1700萬用戶攜號轉網 超99%用戶1小時內辦結

攜號轉網是利國利民的大舉措,受到了很多電信用戶的擁護和支持。12月15日,工信部副部長劉烈宏在某會議上進行報告指出,目前我國 “攜號轉網”服務已經累計有 1700 萬用戶完成攜轉,一小時攜轉成功辦結率超過 99%。已有1700萬用戶攜號…

adb 更新 android sdk,[轉載]安裝Android時SDK?AVD?MANAGER時更新報錯的解決辦法

最近安裝Android SDK時,發現更新時出現“A folder failed to be renamed ormoved.”等類似錯誤。經過測試和G后發現解決辦法目前有兩種情況:1、確實是因為打開了相關目錄或者其他程序占用率文件夾句柄。關閉相關資源管理器或者關閉相關程序即可&#xff…

2020.2idea怎么創建html項目_陳肆橫項目日記:百度百科怎么創建自己的名字

百度百科是一個介紹人物很好的平臺,很多的都想創造屬于自己的百度百科。而人物百科詞條,是百度百科專門為知名人物提供個人信息展示的平臺。創建一個屬于自己的百度百科詞條,就相當于擁有了一張名片,不僅有著影響力與知名度的傳播…

android c++ gizp 調用 so,使用ndk-build編譯 android調用的so庫

前沿編譯so的方法有兩種方法第一種就是編寫原生的makefile文件利用gcc進行編譯,這里我講解的是另外一種。采用NDK提供的ndk-build編譯。簡介使用ndk編譯的時候需要介紹它的腳本文件,Android.mk和Application.mk,但是Application.mk是可選的,用…

elctron項目_electron項目結構介紹

#項目結構my-project├─ .electron-vue(webpack配置文件)│ └─ build.js(生產環境構建代碼)│ └─ dev-client.js(熱加載相關)│ └─ dev-runner.js(開發環境啟動入口)│ └─ webpack.main.config.js(主進程配置文件)│ └─ webpack.renderer.config.js(渲染進程配…

無法啟動mysqll1006_CentOS7下MySQL服務啟動失敗原因及解決方法

在重啟阿里的CentOS7服務器后,重啟MySQL 出現錯誤Starting mysqld (via systemctl):Job for mysqld.service failed because the control process exited with error code.See "systemctl status mysqld.service" and "journalctl -xe" fordetails.[FAILED…

html5判斷多選框是否選擇的函數,復選框(checkbox)、多選框

1、需求分析可同時選中多個選項,實現全選、全不選、反選等功能。2、技術分析基礎的HTML、CSS、JavaScript。3、詳細分析3.1 HTML部分圖示是一個列表加底部一段文字說明,列表包含三個部分,整體是一個多選列表,上部是總的選項&#…

layer調用父頁面方法_Ruby for SketchUp之圖層【Layer】

我們學習了群組、組件及組件定義,今天來看看圖層【Layer】,在Sketchup2020版本中已經更名為“標記”,如圖那么圖層在我們建模過程中能帶來哪些便利呢?可以快速的隱藏同一圖層內所有東西,而不需要逐一選擇并右鍵點擊隱藏…

html盒子有哪些屬性,盒子模型有哪些屬性 在html5中哪些元素具有盒子模型

HTML盒模型基本屬性有哪些CSS盒子模型就是在CSS技術所使用的一種思維模型。CSS假定所有的HTML文檔元素都生成一個描述該元素在HTML文檔布局中所占空間的矩形元素框,可以形象地將其看作是一個盒子。通過定義一系列與盒子相關的屬性,可極大地豐富和促進各個…

huffman編碼的程序流程圖_F28379D之CLB解碼多摩川編碼器2——LIB版例程講解(原創)...

我在第一篇文章中已經跟大家介紹過379解碼多摩川編碼器的一些入手小知識,鏈接如下TMS320F28379D之CLB解碼多摩川編碼器1——入手小知識(原創)請大家一定要看入手小知識,再來看例程分析。今天跟大家分析一下TI的官方例程。首先&…

html統計表合并單元格的快捷鍵,word怎樣設置合并單元格快捷鍵

word2010中合并單元格的快捷鍵是什么?求解答。合并單元格沒有快捷鍵,不過有個f4是重復上一步操作,所以你要合并多個單元格,那么你可以先點一合并單元格,然后選定你要合并的區域。WORD合并單元格的快捷鍵怎么設置word合并單元格快…