Android夜间模式动态切换不闪屏

夜间模式在一些资讯类app中是不可缺少的,通过查阅资料发现Android官方在Support Library 23.2.0中已经加入了夜间主题。也就是只需要通过更换主题便可实现日间模式和夜间模式的切换。下面截取项目实现的夜间模式效果图:

 

实现夜间模式需要的配置 

1.配置gradle 

   implementation 'com.android.support:appcompat-v7:26.1.0'

2.添加夜间颜色资源文件

其中 colors.xml

    <color name="colorPrimary">#FFFFFF</color>
    <color name="colorPrimaryDark">#ffe0e0e0</color>
    <color name="colorAccent">#03A9F4</color>

    <color name="colorBaseBackground">#fafafa</color>

    <color name="colorNavItemUnselected">#757575</color>
    <color name="colorNavItemSelected">@color/colorAccent</color>

    <color name="colorPrimaryText">#212121</color>
    <color name="colorSecondaryText">#757575</color>

values-night   夜间文件夹  切换的时候系统会自己去找这个文件夹

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#35464e</color>
    <color name="colorPrimaryDark">#212a2f</color>
    <color name="colorAccent">#03A9F4</color>

    <color name="colorPrimaryText">#e4e4e4</color>
    <color name="colorSecondaryText">#b5b5b5</color>

    <color name="colorBaseBackground">#212a2f</color>

    <color name="colorNavItemSelected">#03A9F4</color>
    <color name="colorNavItemUnselected">#8799a5</color>
</resources>

切换逻辑实现 这里需要介绍一下有关夜间模式的几个常量值。AppCompatDelegate.setDefaultNightMode(mode),其中mode有一下四个值:

MODE_NIGHT_NO: 亮色(light)主题,不使用夜间模式
MODE_NIGHT_YES:暗色(dark)主题,使用夜间模式
MODE_NIGHT_AUTO:根据当前时间自动切换 亮色(light)/暗色(dark)主题(22:00-07:00时间段内自动切换为夜间模式)
MODE_NIGHT_FOLLOW_SYSTEM(默认选项):设置为跟随系统,通常为MODE_NIGHT_NO 
2.接下来需要我们在设置页面点击ToggleButton时切换白天/夜间模式。 
具体实现如下: 

/**
 * Created by admin on 2018/11/1.
 */

public abstract class BaseActivity extends AppCompatActivity {

    private boolean mNowMode;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        View inflate = LayoutInflater.from(this).inflate(initView(), null);
        setContentView(inflate); ;
           mNowMode = SharedPreferencesUtil.getInstance().getBoolean(Constant.NIGHT);
           initWidget(inflate);
        if(savedInstanceState ==null){
            initData();
        }else{
            restoreSavedInstanceState(savedInstanceState);
        }
    }

    protected abstract void restoreSavedInstanceState(Bundle savedInstanceState);

    protected abstract void initWidget(View inflate);

    protected abstract void initData();

    protected abstract int initView();

    @Override
    protected void onResume() {
        super.onResume();
            theme();
    }

    protected void theme() {
        if (SharedPreferencesUtil.getInstance().getBoolean(Constant.NIGHT, false) != mNowMode) {  //为了避免当 通过recreate重启activity造成死循环
            if (SharedPreferencesUtil.getInstance().getBoolean(Constant.NIGHT, false)) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            } else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            }
            recreate();

        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}

创建 Main2Activity.java 去完成夜间模式 数据恢复

public class Main2Activity extends BaseActivity {

    private ListView lv;
    private CommonAdapter<String> adapter;
    ArrayList<String> list = new ArrayList<>();;
    @Override
    protected void initWidget(View inflate) {
        lv = findViewById(R.id.lv);

        inflate.findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (SharedPreferencesUtil.getInstance().getBoolean(Constant.NIGHT, false)) {
                    SharedPreferencesUtil.getInstance().putBoolean(Constant.NIGHT, false);
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                } else {
                    SharedPreferencesUtil.getInstance().putBoolean(Constant.NIGHT, true);
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                }
                recreate();
            }
        });

        adapter = new CommonAdapter<String>(this,list, R.layout.item) {
            @Override
            public void convert(ViewHolder holder, String s) {
                TextView item_tv = holder.getView(R.id.item_tv);
                item_tv.setText(s);
            }
        };
        lv.setAdapter(adapter);

    }


    @Override
    protected void initData() {
            list.add("abc");
            list.add("abc");
            list.add("abc");
    }


    @Override
    protected int initView() {
        return R.layout.activity_main2;
    }

    /**
     *  恢复数据
     * @param savedInstanceState
     */
    @Override
    protected void restoreSavedInstanceState(Bundle savedInstanceState) {
        list.addAll(savedInstanceState.getStringArrayList("list"));

        adapter.notifyDataSetChanged();
    }

    /**
     * recreate()方法会触发  这个保存数据方法
     * @param outState
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putStringArrayList("list", list);

    }

    @Override
    protected void onResume() {
        super.onResume();

    }
}
activity_main2.XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.roy.admin.themedemo.Main2Activity">


    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="黑夜切换"
        android:textSize="20sp"
        android:textColor="@color/colorPrimaryText"
        android:layout_centerInParent="true"
        />

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/tv"
        >

    </ListView>

</RelativeLayout>

最后奉上demo地址:https://download.csdn.net/download/cly19940419/10759100

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android日间模式切换是指在Android设备中切换应用程序的主题模式,以更好地适应当前环境或用户的个人喜好。在日间模式下,应用程序通常使用浅色的背景和黑色的文本,以提供清晰明亮的外观。下面是关于Android日间模式切换的一些信息: 1. 如何切换日间模式Android设备通常提供了一个系统菜单或设置选项,允许用户切换日间模式。用户可以在“设置”或“显示”菜单中找到“主题”或“外观”选项,并选择日间模式以启用它。 2. 日间模式的用途:日间模式在白天或明亮的环境下使用,可提供更好的可读性和可见性。由于浅色背景和黑色文本的对比度较高,阅读和浏览应用程序内容会更加舒适和方便。 3. 切换日间模式的优势:切换到日间模式可以节省设备的电池寿命,因为设备的背光需要较少的功耗。同时,对于部分用户来说,浅色背景和黑色文本也可能更易于处理眼睛疲劳问题。 4. 日夜模式的应用场景:日间模式适用于大多数日常使用情况,特别是在户外环境或光线充足的环境下。例如,用户在户外使用应用程序时,日间模式可以保证内容清晰可见。 5. 自动切换和自定义设置:一些Android设备允许用户根据日出和日落时间自动切换日间模式。此外,用户还可以根据自己的喜好,自定义日间模式的背景颜色、文本颜色和其他外观设置。 总结起来,Android日间模式切换是一个方便的功能,允许用户根据环境或个人偏好来调整应用程序的外观。通过切换到日间模式,用户可以获得更好的可读性和可见性,并且在一定程度上延长设备的电池寿命。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值