Skip to content

maning0303/MNChangeSkin

Repository files navigation

AndroidChangeSkinDemo

Android夜间模式,通过Theme实现(attrs.xml+styles.xml+Activity.setTheme())

效果展示:

如何添加

Gradle添加:

1.在Project的build.gradle中添加仓库地址

	allprojects {
		repositories {
			...
			maven { url "https://jitpack.io" }
		}
	}

2.在Module目录下的build.gradle中添加依赖

	dependencies {
	     compile 'com.github.maning0303:MNChangeSkin:V1.0.0'
	}

实现步骤:

1.自定义属性
        <attr name="app_background" format="reference|color" />
2.定义两种主题,一个白天,一个夜间
        <!--白天主题-->
        <style name="DayTheme" parent="@android:style/Theme.Light.NoTitleBar">
            <item name="app_background">@color/backgroundColor</item>
        </style>
        <!--黑夜主题-->
        <style name="NightTheme" parent="@android:style/Theme.Light.NoTitleBar">
            <item name="app_background">@color/backgroundColor_night</item>
        </style>
3.布局中使用:
        android:background="?app_background"
        

代码设置:

        1.再Application的onCreate() 中初始化:
                //设置白天主题的和夜间主题
                SkinManager.setThemeID(R.style.DayTheme, R.style.NightTheme);

        2.新建一个BaseActivity,所有Activity继承它public class BaseActivity extends Activity {
                        @Override
                        protected void onCreate(Bundle savedInstanceState) {
                                //设置主题
                                SkinManager.onActivityCreateSetSkin(this);
                                super.onCreate(savedInstanceState);
                        }
                }

        3.XML文件中设置不了的就获取当前主题手动设置int currentSkinType = SkinManager.getCurrentSkinType(this);
                if (SkinManager.THEME_DAY == currentSkinType) {
                    //改变颜色...
                } else {
                    //改变颜色...
                }
                
        4.广播的作用---主要防止设置界面太深而设置界面之前的页面改不了更换主题必须重启Activity才能有效果),如果更改主题的按钮在首页面就没有必要使用注册广播了public void registerSkinReceiver() {
                    skinBroadcastReceiver = new SkinBroadcastReceiver() {
                        @Override
                        public void onChangeSkin(int currentTheme) {
                            Log.i("onChangeSkin", "广播来了" + currentTheme);
                            //重启Activity
                            recreate();
                        }
                    };
                    SkinManager.registerSkinReceiver(OtherActivity.this, skinBroadcastReceiver);
                }

                public void unregisterSkinReceiver() {
                    if (skinBroadcastReceiver != null) {
                        SkinManager.unregisterSkinReceiver(this, skinBroadcastReceiver);
                    }
                }

        5.改变主题:
                //改变主题:自动根据当前主题改变白天和黑夜
                SkinManager.changeSkin(this);
                //改变主题:指定主题
                //SkinManager.changeSkin(this,R.style.DayTheme);
                //重启当前Activity
                startActivity(new Intent(this, SettingActivity.class));
                //重要:做一个自定义动画,避免出现闪烁现象
                overridePendingTransition(com.maning.themelibrary.R.anim.mn_theme_activity_enter, com.maning.themelibrary.R.anim.mn_theme_activity_exit);
                finish();


        6.关于WebView设置夜间模式:
                webView.setWebViewClient(new WebViewClient() {
                            ...

                            @Override
                            public void onPageFinished(WebView view, String url) {
                                super.onPageFinished(view, url);
                                //设置webView,这里是设置夜间模式的颜色
                                String backgroudColor = "#232736";
                                String fontColor = "#626f9b";
                                String urlColor = "#9AACEC";
                                SkinManager.setColorWebView(webView, backgroudColor, fontColor, urlColor);
                            }

                            ...
                        });

        

详情见Demo

上线项目使用:

ColorMatrix 实现各种模式:

推荐:

Name Describe
GankMM (Material Design & MVP & Retrofit + OKHttp & RecyclerView ...)Gank.io Android客户端:每天一张美女图片,一个视频短片,若干Android,iOS等程序干货,周一到周五每天更新,数据全部由 干货集中营 提供。
MNUpdateAPK Android APK 版本更新的下载和安装,适配7.0,简单方便。
MNImageBrowser 交互特效的图片浏览框架,微信向下滑动动态关闭
MNCalendar 简单的日历控件练习,水平方向日历支持手势滑动切换,跳转月份;垂直方向日历选取区间范围。
MClearEditText 带有删除功能的EditText
MNCrashMonitor Debug监听程序崩溃日志,展示崩溃日志列表,方便自己平时调试。
MNProgressHUD MNProgressHUD是对常用的自定义弹框封装,加载ProgressDialog,状态显示的StatusDialog和自定义Toast,支持背景颜色,圆角,边框和文字的自定义。
MNXUtilsDB xUtils3 数据库模块单独抽取出来,方便使用。
MNVideoPlayer SurfaceView + MediaPlayer 实现的视频播放器,支持横竖屏切换,手势快进快退、调节音量,亮度等。------代码简单,新手可以看一看。
MNZXingCode 快速集成二维码扫描和生成二维码
MNChangeSkin Android夜间模式,通过Theme实现
SwitcherView 垂直滚动的广告栏文字展示。

About

Android夜间模式,通过Theme实现

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages