java代码中切换模式_夜间模式切换的实现库,只需三行代码实现流畅切换

Implementation of night mode for Android.

用最简单的方式实现夜间模式,支持ListView、RecyclerView。

Preview

74890e828764

ChangeMode

Usage xml

android:background="?attr/zzbackground"

app:backgroundAttr="zzbackground"//如果当前页面要立即刷新,这里传入属性名称 比如R.attr.zzbackground 传zzbackground即可

android:textColor="?attr/zztextColor"

app:textColorAttr="zztextColor"//如需立即刷新页面效果 同上

java

@Override

protected void onCreate(Bundle savedInstanceState) {

// 在要立即切换效果的页面调用此方法

ChangeModeController.getInstance().init(this,R.attr.class).setTheme(this, R.style.DayTheme, R.style.NightTheme);

//在其他页面调用此方法

//ChangeModeController.setTheme(this, R.style.DayTheme, R.style.NightTheme);

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//添加额外view至夜间管理

// ChangeModeController.getInstance().addBackgroundColor(toolbar, R.attr.colorPrimary);

//ChangeModeController.getInstance().addBackgroundDrawable(view,R.attr.colorAccent);

// ChangeModeController.getInstance().addTextColor(view,R.attr.colorAccent);

// 设置切换

//ChangeModeController.changeDay(this, R.style.DayTheme);

//ChangeModeController.changeNight(this, R.style.NightTheme);

}

@Override

protected void onDestroy() {

super.onDestroy();

// 在onDestroy调用

ChangeModeController.onDestory();

}

详细操作描述

第一步:自定义属性

第二步:配置夜间style文件

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

false

true

true

@color/dayBackground

@drawable/ic_launcher

@color/dayTextColor

@color/dayItemBackground

@color/nightBackground

@color/nightBackground

@color/nightTextColor

@color/nightItemBackground

@color/colorPrimaryNight

@color/colorPrimaryDarkNight

@color/colorAccentNight

为相关属性设置对应模式的属性值:

#F2F4F7

#000

#fff

#37474F

#263238

#fff

第三步:在布局文件中配置使用对应属性

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:orientation="vertical"

android:background="?attr/zzbackground"

app:backgroundAttr="zzbackground"

tools:context="com.thinkfreely.changemode.MainActivity">

android:layout_width="match_parent"

android:layout_height="wrap_content"

app:theme="@style/AppTheme.AppBarOverlay">

android:id="@+id/toolbar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

android:background="?attr/colorPrimary"

app:backgroundAttr="colorPrimary"

app:titleTextColor="?attr/zztextColor"

app:popupTheme="@style/AppTheme.PopupOverlay"

/>

android:layout_width="match_parent"

android:layout_height="120dp"

android:gravity="center"

android:textColor="?attr/zztextColor"

app:textColorAttr="zztextColor"

android:background="?attr/zzItemBackground"

app:backgroundAttr="zzItemBackground"

android:padding="10dp"

android:layout_marginBottom="8dp"

android:textSize="22sp"

android:textAllCaps="false"

android:text="夜间模式切换by Mr.Zk" />

android:id="@+id/recyclerView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:scrollbars="vertical"/>

注意textColorAttr、backgroundAttr、backgroundDrawableAttr三个属性。如需当前页面立即刷新,需填加相应属性。

属性

描述

textColorAttr

修改字体颜色时设置。如R.attr.zztextColor 传zztextColor 即可。例:app:textColorAttr="zztextColor"

backgroundAttr

修改背景颜色/背景图片时设置。同上。例: app:backgroundAttr="zzbackground"

backgroundDrawableAttr

修改背景颜色/背景图片时设置。同上。例: app:backgroundDrawableAttr="zzbackground"

第四步:页面调用java代码

@Override

protected void onCreate(Bundle savedInstanceState) {

//1. 在要立即切换效果的页面调用此方法

ChangeModeController.getInstance().init(this,R.attr.class).setTheme(this, R.style.DayTheme, R.style.NightTheme);

//在其他页面调用此方法

//ChangeModeController.setTheme(this, R.style.DayTheme, R.style.NightTheme);

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//2.设置切换夜间活日间模式

//ChangeModeController.changeDay(this, R.style.DayTheme);//切换日间模式

//ChangeModeController.changeNight(this, R.style.NightTheme);//切换夜间模式

}

@Override

protected void onDestroy() {

super.onDestroy();

//3. 在onDestroy调用

ChangeModeController.onDestory();

}

代码调用三步,即可开始夜间之旅。

如果页面有新创建的视图要加入夜间模式控制,代码调用:

//添加额外view至夜间管理

// ChangeModeController.getInstance().addBackgroundColor(toolbar, R.attr.colorPrimary);

//ChangeModeController.getInstance().addBackgroundDrawable(view,R.attr.colorAccent);

// ChangeModeController.getInstance().addTextColor(view,R.attr.colorAccent);

如果在改变夜间模式时有其他非标准定义的属性时,可在ChangeModeController.changeDay或ChangeModeController.changeNight之后调用如下代码给相关属性赋值:

TypedValue attrTypedValue = ChangeModeController.getAttrTypedValue(this, R.attr.zztextColor);

toolbar.setTitleTextColor(getResources().getColor(attrTypedValue.resourceId));

下一篇对实现库的原理进行介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Java 注解实现动态数据源切换的实例代码: 首先,我们要定义一个注解 `@DataSource`,用于标记要使用的数据源: ``` @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface DataSource { String value() default "default"; } ``` 然后,我们要定义一个数据源切换的切面 `DataSourceAspect`,在该切面,我们可以通过读取注解的值,来切换到相应的数据源: ``` @Aspect @Component public class DataSourceAspect { @Around("@annotation(dataSource)") public Object around(ProceedingJoinPoint point, DataSource dataSource) throws Throwable { String dataSourceName = dataSource.value(); DynamicDataSource.setDataSource(dataSourceName); try { return point.proceed(); } finally { DynamicDataSource.clearDataSource(); } } } ``` 在上面的代码,我们通过 `@Around` 注解定义了一个环绕通知,通过 `@annotation(dataSource)` 表示该通知绑定在标记了 `@DataSource` 注解的方法上面。在通知,我们首先读取注解的值 `dataSource.value()`,然后调用 `DynamicDataSource.setDataSource()` 方法来切换数据源,在方法执完成后,我们再调用 `DynamicDataSource.clearDataSource()` 方法来清除当前线程的数据源信息。 最后,我们要定义一个 `DynamicDataSource` 类,用于存储当前线程所使用的数据源: ``` public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> dataSourceHolder = new ThreadLocal<>(); public static void setDataSource(String dataSourceName) { dataSourceHolder.set(dataSourceName); } public static void clearDataSource() { dataSourceHolder.remove(); } @Override protected Object determineCurrentLookupKey() { return dataSourceHolder.get(); } } ``` 在上面的代码,我们继承了 Spring 的 `AbstractRoutingDataSource` 类,并重写了其的 `determineCurrentLookupKey()` 方法,该方法返回当前线程所使用的数据源名称。在 `setDataSource()` 方法,我们将当前线程要使用的数据源名称存入了 `ThreadLocal` ,在 `clearDataSource()` 方法,则是清除了该值。 以上就是 Java 注解实现动态数据源切换的实例代码,希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值