Android 学习笔记之切换主题

首先要有主题颜色

theme_color.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3
 4     <!--红-->
 5     <color name="red">#FF6347</color>
 6     <color name="dark_red">#F4511E</color>
 7     <color name="accent_red">#FF5722</color>
 8
 9     <!--棕-->
10     <color name="brown">#795548</color>
11     <color name="dark_brown">#5D4037</color>
12     <color name="accent_brown">#795548</color>
13
14     <!--蓝-->
15     <color name="blue">#3F51B5</color>
16     <color name="dark_blue">#303F9F</color>
17     <color name="accent_blue">#3F51B5</color>
18
19     <!--蓝灰-->
20     <color name="blue_grey">#607D8B</color>
21     <color name="dark_blue_grey">#455A64</color>
22     <color name="accent_blue_grey">#607D8B</color>
23
24     <!--黄-->
25     <color name="yellow">#FF9800</color>
26     <color name="dark_yellow">#F57C00</color>
27     <color name="accent_yellow">#FF9800</color>
28
29     <!--紫-->
30     <color name="deep_purple">#673AB7</color>
31     <color name="dark_deep_purple">#512DA8</color>
32     <color name="accent_deep_purple">#7C4DFF</color>
33
34     <!--粉红-->
35     <color name="pink">#E91E63</color>
36     <color name="dark_pink">#C2185B</color>
37     <color name="accent_pink">#FF5722</color>
38
39     <!--绿-->
40     <color name="green">#4CAF50</color>
41     <color name="dark_green">#388E3C</color>
42     <color name="accent_green">#4CAF50</color>
43
44 </resources>

以及主题

theme_syyles.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3
 4     <!--<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">-->
 5         <!--<item name="android:textColorPrimary">@color/text_black</item>-->
 6         <!--&lt;!&ndash;主背景色&ndash;&gt;-->
 7         <!--<item name="android:windowBackground">@android:color/white</item>-->
 8     <!--</style>-->
 9
10     <!--蓝色主题-->
11     <style name="BlueTheme" parent="AppTheme">
12         <item name="colorPrimary">@color/blue</item>
13         <item name="colorPrimaryDark">@color/dark_blue</item>
14         <item name="colorAccent">@color/accent_blue</item>
15     </style>
16
17     <!--蓝灰色主题-->
18     <style name="BlueGreyTheme" parent="AppTheme">
19         <item name="colorPrimary">@color/blue_grey</item>
20         <item name="colorPrimaryDark">@color/dark_blue_grey</item>
21         <item name="colorAccent">@color/accent_blue_grey</item>
22     </style>
23
24     <!--红色主题-->
25     <style name="RedTheme" parent="AppTheme">
26         <item name="colorPrimary">@color/red</item>
27         <item name="colorPrimaryDark">@color/dark_red</item>
28         <item name="colorAccent">@color/accent_red</item>
29     </style>
30
31     <!--棕色主题-->
32     <style name="BrownTheme" parent="AppTheme">
33         <item name="colorPrimary">@color/brown</item>
34         <item name="colorPrimaryDark">@color/dark_brown</item>
35         <item name="colorAccent">@color/accent_brown</item>
36     </style>
37
38     <!--黄色主题-->
39     <style name="YellowTheme" parent="AppTheme">
40         <item name="colorPrimary">@color/yellow</item>
41         <item name="colorPrimaryDark">@color/dark_yellow</item>
42         <item name="colorAccent">@color/accent_yellow</item>
43     </style>
44
45     <!--紫色主题-->
46     <style name="DeepPurpleTheme" parent="AppTheme">
47         <item name="colorPrimary">@color/deep_purple</item>
48         <item name="colorPrimaryDark">@color/dark_deep_purple</item>
49         <item name="colorAccent">@color/accent_deep_purple</item>
50     </style>
51
52     <!--粉红色主题-->
53     <style name="PinkTheme" parent="AppTheme">
54         <item name="colorPrimary">@color/pink</item>
55         <item name="colorPrimaryDark">@color/dark_pink</item>
56         <item name="colorAccent">@color/accent_pink</item>
57     </style>
58
59     <!--绿色主题-->
60     <style name="GreenTheme" parent="AppTheme">
61         <item name="colorPrimary">@color/green</item>
62         <item name="colorPrimaryDark">@color/dark_green</item>
63         <item name="colorAccent">@color/accent_green</item>
64     </style>
65 </resources>

MainActivity.java

 1 package com.example.myapplication;
 2
 3 import android.content.Intent;
 4 import android.support.v7.app.AlertDialog;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.os.Bundle;
 7 import android.view.LayoutInflater;
 8 import android.view.View;
 9 import android.view.ViewGroup;
10 import android.widget.AdapterView;
11 import android.widget.BaseAdapter;
12 import android.widget.GridView;
13 import android.widget.ImageView;
14
15 import java.util.ArrayList;
16 import java.util.List;
17
18 public class MainActivity extends AppCompatActivity {
19     private List<Integer> listColor  = new ArrayList();;
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         ThemeUtils.changTheme(this);
23         super.onCreate(savedInstanceState);
24         setContentView(R.layout.activity_main);
25         findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
26             @Override
27             public void onClick(View view) {
28                 initt();
29             }
30         });
31
32     }
33
34     /**
35      * 方法
36      */
37     private void initt() {
38         //为LIST添加数值
39         listColor.add(R.color.red);
40         listColor.add(R.color.brown);
41         listColor.add(R.color.blue);
42         listColor.add(R.color.blue_grey);
43         listColor.add(R.color.yellow);
44         listColor.add(R.color.deep_purple);
45         listColor.add(R.color.pink);
46         listColor.add(R.color.green);
47         //构建对话框
48         AlertDialog.Builder alertdoalog = new AlertDialog.Builder(this);
49         alertdoalog.setTitle("切换主题");
50         //绑定 布局
51         View view = LayoutInflater.from(this).inflate(R.layout.theme_colors_panel_layout,null);
52         //初始化网格视图
53         GridView gridview = (GridView) view.findViewById(R.id.grid);
54         //填充Adapter
55         ThemeAdapter  themeadapter = new ThemeAdapter(MainActivity.this,listColor,R.layout.theme_colors_image_layout);
56         //set当前点击
57         themeadapter.setCheckItem((Integer) SharedPreferenceUtil.get(this,"key",0));
58
59         gridview.setAdapter(themeadapter);
60         gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
61             @Override
62             public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
63                 //保存当前点击
64                 SharedPreferenceUtil.put(MainActivity.this,"key",i);
65                 //重新启动
66                 startActivity(new Intent(MainActivity.this,MainActivity.class));
67                 //关闭
68                 finish();
69             }
70         });
71         alertdoalog.setView(view);
72         alertdoalog.show();
73     }
74 }
ThemeUtils.java
 1 package com.example.myapplication;
 2
 3 import android.app.Activity;
 4
 5 /**
 6  * 主题工具类
 7  */
 8 public class ThemeUtils {
 9
10     /**
11      * 修改主题
12      * @param activity
13      */
14     public static void changTheme(Activity activity){
15         if (activity == null)
16             return;
17
18         int position = (int) SharedPreferenceUtil.get(activity,"key", 0);
19         int style = R.style.BlueTheme;
20         switch (position){
21             case 0:
22                 style = R.style.YellowTheme;
23                 break;
24             case 1:
25                 style = R.style.BrownTheme;
26                 break;
27             case 2:
28                 style = R.style.BlueTheme;
29                 break;
30             case 3:
31                 style = R.style.BlueGreyTheme;
32                 break;
33             case 4:
34                 style = R.style.YellowTheme;
35                 break;
36             case 5:
37                 style = R.style.DeepPurpleTheme;
38                 break;
39             case 6:
40                 style = R.style.PinkTheme;
41                 break;
42             case 7:
43                 style = R.style.GreenTheme;
44                 break;
45             default:
46                 break;
47         }
48         activity.setTheme(style);
49     }
50
51 }
SharedPreferenceUtil.java
package com.example.myapplication;

import android.content.Context;
import android.content.SharedPreferences;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

/**
 * Stay  hungry , Stay  foolish

 * Copyright(c) 2016 www.wuxianedu.com Inc. All rights reserved.
 */
public class SharedPreferenceUtil {
    public static final String FILE_NAME = "share_data"; // SharedPreference操作的文件

    /**
     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
     * @param context
     * @param key
     * @param object
     */
    public static void put(Context context, String key, Object object) {

        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        if (object instanceof String) {
            editor.putString(key, (String) object);
        } else if (object instanceof Integer) {
            editor.putInt(key, (Integer) object);
        } else if (object instanceof Boolean) {
            editor.putBoolean(key, (Boolean) object);
        } else if (object instanceof Float) {
            editor.putFloat(key, (Float) object);
        } else if (object instanceof Long) {
            editor.putLong(key, (Long) object);
        } else {
            editor.putString(key, object.toString());
        }

        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
     *
     * @param context
     * @param key
     * @param defaultObject
     * @return
     */
    public static Object get(Context context, String key, Object defaultObject) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);

        if (defaultObject instanceof String || defaultObject==null) {
            return sp.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return sp.getInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return sp.getFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return sp.getLong(key, (Long) defaultObject);
        }
        return null;
    }

    /**
     * 移除某个key值已经对应的值
     *
     * @param context
     * @param key
     */
    public static void remove(Context context, String key) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.remove(key);
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 返回所有的键值对
     *
     * @param context
     * @return
     */
    public static Map<String, ?> getAll(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        return sp.getAll();
    }

    /**
     * 清除所有数据
     *
     * @param context
     */
    public static void clearAll(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 查询某个key是否已经存在
     *
     * @param context
     * @param key
     * @return
     */
    public static boolean contains(Context context, String key) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        return sp.contains(key);
    }

    /**
     * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
     */
    private static class SharedPreferencesCompat {
        private static final Method sApplyMethod = findApplyMethod();

        /**
         * 反射查找apply的方法
         * @return
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        private static Method findApplyMethod() {
            try {
                Class clz = SharedPreferences.Editor.class;
                return clz.getMethod("apply");
            } catch (NoSuchMethodException e) {
            }

            return null;
        }

        /**
         * 如果找到则使用apply执行,否则使用commit
         *
         * 里面所有的commit操作使用了SharedPreferencesCompat.apply进行了替代,目的是尽可能的使用apply代替commit
         * 首先说下为什么,因为commit方法是同步的,并且我们很多时候的commit操作都是UI线程中,毕竟是IO操作,尽可能异步;
         * 所以我们使用apply进行替代,apply异步的进行写入;
         * @param editor
         */
        public static void apply(SharedPreferences.Editor editor) {
            try {
                if (sApplyMethod != null) {
                    sApplyMethod.invoke(editor);
                    return;
                }
            } catch (IllegalArgumentException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
            editor.commit();
        }
    }
}
ThemeAdapter.java
 1 package com.example.myapplication;
 2
 3 import android.content.Context;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.BaseAdapter;
 8 import android.widget.ImageView;
 9
10 import java.util.List;
11
12 /**
13  * Created by Administrator on 2016/12/5.
14  */
15 public class ThemeAdapter extends BaseCustomAdapter {
16     private int checkItem;
17     public ThemeAdapter(Context context, List data, int layoutResId) {
18         super(context, data, layoutResId);
19     }
20
21     @Override
22     public View getCustomView(int position, View convertView) {
23         ImageView imageView1 = (ImageView) convertView.findViewById(R.id.img_1);
24         ImageView imageView2 = (ImageView) convertView.findViewById(R.id.img_2);
25         imageView1.setImageResource((Integer) data.get(position));
26         if(checkItem == position){
27             imageView2.setImageResource(R.mipmap.ic_done_white);
28         }
29         return convertView;
30     }
31
32     public void setCheckItem(int checkItem) {
33         this.checkItem = checkItem;
34     }
35 }
BaseCustomAdapter.java
  1 package com.example.myapplication;
  2
  3 import android.content.Context;
  4 import android.view.LayoutInflater;
  5 import android.view.View;
  6 import android.view.ViewGroup;
  7 import android.widget.BaseAdapter;
  8
  9
 10 import java.util.List;
 11
 12 /**
 13  *
 14  *
 15  * 2015年10月26日,0026.
 16  * 所有BaseAdapter的直接父类
 17  * @param <E>
 18  */
 19 public abstract class BaseCustomAdapter<E> extends BaseAdapter {
 20
 21     protected LayoutInflater layoutInflater;
 22
 23     protected List<E> data;
 24
 25     protected int layoutResId; // item id
 26
 27     public BaseCustomAdapter(Context context, List<E> data, int layoutResId) {
 28         this.layoutResId = layoutResId;
 29         this.data=data;
 30         this.layoutInflater = LayoutInflater.from(context);
 31     }
 32
 33
 34
 35     public void addAll(List<E> data){
 36         this.data.addAll(data);
 37         notifyDataSetChanged();
 38
 39     }
 40
 41     public void addAll(int location,List<E> data){
 42         this.data.addAll(location, data);
 43         notifyDataSetChanged();
 44     }
 45
 46     public void add(E e){
 47         this.data.add(e);
 48         notifyDataSetChanged();
 49     }
 50
 51     public void add(int location,E e){
 52         this.data.add(location, e);
 53         notifyDataSetChanged();
 54     }
 55
 56     public void remove(int location){
 57         this.data.remove(location);
 58         notifyDataSetChanged();
 59     }
 60
 61     public void remove(E e){
 62         this.data.remove(e);
 63         notifyDataSetChanged();
 64     }
 65
 66     public void removeAll(List<E> data){
 67         this.data.removeAll(data);
 68         notifyDataSetChanged();
 69     }
 70
 71     @Override
 72     public int getCount() {
 73         return data.size();
 74     }
 75
 76     @Override
 77     public E getItem(int position) {
 78         return data.get(position);
 79     }
 80
 81     @Override
 82     public long getItemId(int position) {
 83         return position;
 84     }
 85
 86     @Override
 87     public View getView(int position, View convertView, ViewGroup parent) {
 88         if(convertView == null){
 89             convertView = layoutInflater.inflate(layoutResId,null);
 90             getListener(convertView);
 91         }
 92         getCustomView(position, convertView);
 93         return convertView;
 94     }
 95
 96     public abstract View getCustomView(int position, View convertView);
 97
 98     /**
 99      * 如果需要点击事件  重写此方法
100      */
101     protected void getListener(View convertView){}
102 }

好了,到这里切换主题就可以实现了

时间: 2024-12-29 07:36:07

Android 学习笔记之切换主题的相关文章

Android学习笔记----闪屏主题

<!--闪屏主题--> <style name="welcome" parent="AppTheme"> <!--窗口透明--> <item name="android:windowIsTranslucent">true</item> </style>

Android学习笔记之Theme主题的修改设置

(1)布局文件 <RelativeLayout 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" android:p

Android学习笔记(三七):再谈屏幕切换

切换需注意数据保存和恢复 在Android学习笔记(三六):横屏竖屏的切换中,我们配置了两个layout,一个用户普通的portrait,一个用户landsapce方式.如果只有一个layout,我们沿用上一个例子,删除了在layout-land/中的xml文件,则在屏幕切换时,会按照原来的排版,适配新的屏幕.程序我进行了简化,每按一次pick,就加一,用此来跟踪是否需要进行数据保存和恢复,如下: [java] view plaincopy public class Chapter19Test3

【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transaction进行切换,很方便提供切换的效果. 利用setTransition() 在Pro Android学习笔记(三九):Fragment(4):基础小例子-续的“Step 4:实现showDetail(int index),如何管理fragment”中,介绍了如何在容器FrameLayout中通过frag

Android学习笔记之mainfest文件中android属性

Android学习笔记之mainfest文件中android属性 - Impossible is nothing - 博客频道 - CSDN.NET 以前的零散笔记, 共享一下, 有错误的地方还请指正. android:allowTaskReparenting 是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务.---------------------------------------------------------------------------------

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

十三、Android学习笔记_Andorid控件样式汇总

<!-- 设置activity为透明 --> <style name="translucent"> <item name="android:windowBackground">@color/translucent</item> <item name="android:windowIsTranslucent">true</item> <item name="an

Android学习笔记_75_Andorid控件样式汇总

<!-- 设置activity为透明 --> <style name="translucent"> <item name="android:windowBackground">@color/translucent</item> <item name="android:windowIsTranslucent">true</item> <item name="an