日夜モードの切り替え
11185 ワード
ネットで何日間の夜間モードの切り替えの方法を見ましたが、大体3種類です。もっともいいのは反射によって達成されることです。参照リンク:http://yuqirong.me/2016/09/08/Androidのナイトモード実現についての検討/
1:valuesフォルダ下のcolors.xmlに追加:
1:valuesフォルダ下のcolors.xmlに追加:
<color name="textColor">#3b3b3b
<color name="textColor_night">#FFFFFF
<color name="backgroundColor">#FFFFFF
<color name="backgroundColor_night">#3b3b3b
2:The me管理クラスを作成するpackage com.example.administrator.demo.view;
import android.content.Context;
import android.content.res.Resources;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
public class ThemeManager {
//
private static ThemeMode mThemeMode = ThemeMode.DAY;
//
private static List mThemeChangeListenerList = new LinkedList<>();
// ,key : ,
private static HashMap> sCachedNightResrouces = new HashMap<>();
// , :R.color.activity_bg, :R.color.activity_bg_night
private static final String RESOURCE_SUFFIX = "_night";
/**
* ,
*/
public enum ThemeMode {
DAY, NIGHT
}
/**
*
*/
public static void setThemeMode(ThemeMode themeMode) {
if (mThemeMode != themeMode) {
mThemeMode = themeMode;
if (mThemeChangeListenerList.size() > 0) {
for (OnThemeChangeListener listener : mThemeChangeListenerList) {
listener.onThemeChanged();
}
}
}
}
/**
* resId resId, : resId
* resId
* resId, , dayResId; nightResId
*/
public static int getCurrentThemeRes(Context context, int dayResId) {
if (getThemeMode() == ThemeMode.DAY) {
return dayResId;
}
//
String entryName = context.getResources().getResourceEntryName(dayResId);
//
String typeName = context.getResources().getResourceTypeName(dayResId);
HashMap cachedRes = sCachedNightResrouces.get(typeName);
// , id
if (cachedRes == null) {
cachedRes = new HashMap<>();
}
Integer resId = cachedRes.get(entryName + RESOURCE_SUFFIX);
if (resId != null && resId != 0) {
return resId;
} else {
// id
try {
// , , int
int nightResId = context.getResources().getIdentifier(entryName + RESOURCE_SUFFIX, typeName, context.getPackageName());
//
cachedRes.put(entryName + RESOURCE_SUFFIX, nightResId);
sCachedNightResrouces.put(typeName, cachedRes);
return nightResId;
} catch (Resources.NotFoundException e) {
e.printStackTrace();
}
}
return 0;
}
/**
* ThemeChangeListener
*/
public static void registerThemeChangeListener(OnThemeChangeListener listener) {
if (!mThemeChangeListenerList.contains(listener)) {
mThemeChangeListenerList.add(listener);
}
}
/**
* ThemeChangeListener
*/
public static void unregisterThemeChangeListener(OnThemeChangeListener listener) {
if (mThemeChangeListenerList.contains(listener)) {
mThemeChangeListenerList.remove(listener);
}
}
/**
*
*/
public static ThemeMode getThemeMode() {
return mThemeMode;
}
/**
*
*/
public interface OnThemeChangeListener {
/**
*
*/
void onThemeChanged();
}
}
3:Activityで使用するpackage com.example.administrator.demo.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import com.example.administrator.demo.R;
import com.example.administrator.demo.view.ThemeManager;
public class MainActivity extends Activity implements ThemeManager.OnThemeChangeListener{
private Button day_night_mode;
private RelativeLayout relativeLayout;
private boolean isDay = true;//
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ThemeManager.registerThemeChangeListener(this);
day_night_mode = (Button) findViewById(R.id.day_night_mode);
relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
day_night_mode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isDay==true){
ThemeManager.setThemeMode(ThemeManager.ThemeMode.NIGHT );
day_night_mode.setText(" ");
isDay=false;
}else {
ThemeManager.setThemeMode(ThemeManager.ThemeMode.DAY );
day_night_mode.setText(" ");
isDay=true;
}
}
});
}
@Override
public void onThemeChanged() {
//
day_night_mode.setTextColor(getResources().getColor(ThemeManager.getCurrentThemeRes(MainActivity.this, R.color.textColor)));
relativeLayout.setBackgroundColor(getResources().getColor(ThemeManager.getCurrentThemeRes(MainActivity.this, R.color.backgroundColor)));
}
@Override
protected void onDestroy() {
super.onDestroy();
ThemeManager.unregisterThemeChangeListener(this);
}
}