zoukankan      html  css  js  c++  java
  • Android夜间模式的几种实现

    一、直接修改widget颜色,这种方式实现起来最简单,但需要每个控件都去修改,太过复杂。例如:

        /**
         * 相应交互,修改控件颜色
         * @param view
         */
        public void onMethod1Click(View view) {
            if (view.getId() == R.id.btn_method1) {
                int theme = NightModeUtils.getSwitchDayNightMode(this);
                NightModeUtils.setBackGroundColor(this, mRootView, theme);
                NightModeUtils.setTextColor(this, findViewById(R.id.text), theme);
                NightModeUtils.setDayNightMode(this, theme);
            }
        }

    NightModeUitls修改颜色方法

        /**
         * 修改背景色
         * @param context
         * @param view
         * @param theme
         */
        public static void setBackGroundColor(Context context, View view, int theme) {
            int color = context.getResources().getColor(
                    theme == THEME_SUN ? R.color.light_color : R.color.night_color);
            view.setBackgroundColor(color);
        }
    
        /**
         * 修改文字色
         * @param context
         * @param view
         * @param theme
         */
        public static void setTextColor(Context context, View view, int theme) {
            int color = context.getResources().getColor(
                    theme == THEME_SUN ? R.color.night_color : R.color.light_color);
            TextView textView = (TextView)view;
            textView.setTextColor(color);
        }

    二、通过修改Theme,更新应用主题。这种方法问题在于,需要重启Activity才能完成界面渲染。

    在Activity中调用setContentView之前进行Theme设置:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            NightModeUtils.onActivityCreateSetTheme(this);
            setContentView(R.layout.activity_main);
        }

    NightModeUitls设置Theme方法:

        /** Set the theme of the activity, according to the configuration. */
        public static void onActivityCreateSetTheme(Activity activity) {
            int theme = getDayNightMode(activity);
            switch (theme) {
                case THEME_SUN:
                    activity.setTheme(R.style.AppSunTheme);
                    break;
                case THEME_NIGHT:
                    activity.setTheme(R.style.AppNightTheme);
                    break;
                default:
                    break;
            }
        }

    三、通过怎加一层遮光罩来实现。效果不是很理想。

    通过WindowManager,将一个透明背景的TextView加到Activity主界面中。代码如下:

        private void night() {
            if (mNightView == null) {
                mNightView = new TextView(this);
                mNightView.setBackgroundColor(0xaa000000);
            }
    
            WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                    LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT);
            lp.gravity = Gravity.BOTTOM;
            lp.y = 10;
    
            try {
                mWindowManager.addView(mNightView, lp);
            } catch (Exception ex) {
            }
        }
    
        private void day() {
            try {
                mWindowManager.removeView(mNightView);
            } catch (Exception ex) {
            }
        }

    四、最后来看一下Dialog需要怎么实现夜间模式。

    AlertDialog.Builder 有一个带style id参数的构造函数,我们就通过这个构造函数来实现Dialog主题的修改,从而达到夜间模式。

        public static AlertDialog.Builder createBuilder(Context context) {
            if (NightModeUtils.getDayNightMode(context) == NightModeUtils.THEME_SUN) {
                return new AlertDialog.Builder(context);
            } else {
                return new AlertDialog.Builder(context, R.style.NightDialog);
            }
        }

    我们通过如上方法来获取Builder,实现主题切换。其中R.style.NightDialog我采用如下方式:

        <style name="NightDialog" parent="android:Theme.Holo.Dialog">
            <item name="android:windowBackground">@android:color/transparent</item>
        </style>

    在android honeycomb之前的版本Theme.Dialog.Alert与AlertDialog这两个style是public的,可以通过修改主题时,重新定义这两个style实现dialog主题的修改,但之后的版本已经将他们开放关闭了。所以,我通过上面的办法实现了dialog的主题修改。

    Demo源码

  • 相关阅读:
    012_py之证书过期监测及域名使用的py列表的并集差集交集
    一些java的书籍
    java之内的工具分享,附带下载链接,方便以后自己寻找
    javascript的 == 与 === 的区别
    论httpclient上传带参数【commons-httpclient和apache httpclient区别】
    java操作小技巧,遇到过的会一直更新,方便查找
    常用jsp include用法,三种include的区别
    mybatis中的#和$的区别
    单例模式
    jQuery获取Select选择的Text和 Value(转)用时比较方便寻找
  • 原文地址:https://www.cnblogs.com/yuanzhanxue/p/3470820.html
Copyright © 2011-2022 走看看