由于最近需要做webview黑夜模式的处理,找了好多资料,最后为大家奉上,此篇并不完全是原创,算是借鉴哈!
首先是在application中做初始化
initPrefs();
initNightMode();
/**
* 初始化SharedPreference
*/
protected void initPrefs() {
SharedPreferencesUtil.init(getApplicationContext(), getPackageName() + "_preference", Context.MODE_MULTI_PROCESS);
}
protected void initNightMode() {
boolean isNight = SharedPreferencesUtil.getInstance().getBoolean(Constant.ISNIGHT, false);
Log.e("isNight=", ""+ isNight);
if (isNight) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}
public class SharedPreferencesUtil {
private static SharedPreferencesUtil prefsUtil;
public Context context;
public SharedPreferences prefs;
public SharedPreferences.Editor editor;
public synchronized static SharedPreferencesUtil getInstance() {
return prefsUtil;
}
public static void init(Context context, String prefsname, int mode) {
prefsUtil = new SharedPreferencesUtil();
prefsUtil.context = context;
prefsUtil.prefs = prefsUtil.context.getSharedPreferences(prefsname, mode);
prefsUtil.editor = prefsUtil.prefs.edit();
}
private SharedPreferencesUtil() {
}
public boolean getBoolean(String key, boolean defaultVal) {
return this.prefs.getBoolean(key, defaultVal);
}
public boolean getBoolean(String key) {
return this.prefs.getBoolean(key, false);
}
public String getString(String key, String defaultVal) {
return this.prefs.getString(key, defaultVal);
}
public String getString(String key) {
return this.prefs.getString(key, null);
}
public int getInt(String key, int defaultVal) {
return this.prefs.getInt(key, defaultVal);
}
public int getInt(String key) {
return this.prefs.getInt(key, 0);
}
public float getFloat(String key, float defaultVal) {
return this.prefs.getFloat(key, defaultVal);
}
public float getFloat(String key) {
return this.prefs.getFloat(key, 0f);
}
public long getLong(String key, long defaultVal) {
return this.prefs.getLong(key, defaultVal);
}
public long getLong(String key) {
return this.prefs.getLong(key, 0l);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public Set<String> getStringSet(String key, Set<String> defaultVal) {
return this.prefs.getStringSet(key, defaultVal);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public Set<String> getStringSet(String key) {
return this.prefs.getStringSet(key, null);
}
public Map<String, ?> getAll() {
return this.prefs.getAll();
}
public boolean exists(String key) {
return prefs.contains(key);
}
public SharedPreferencesUtil putString(String key, String value) {
editor.putString(key, value);
editor.commit();
return this;
}
public SharedPreferencesUtil putInt(String key, int value) {
editor.putInt(key, value);
editor.commit();
return this;
}
public SharedPreferencesUtil putFloat(String key, float value) {
editor.putFloat(key, value);
editor.commit();
return this;
}
public SharedPreferencesUtil putLong(String key, long value) {
editor.putLong(key, value);
editor.commit();
return this;
}
public SharedPreferencesUtil putBoolean(String key, boolean value) {
editor.putBoolean(key, value);
editor.commit();
return this;
}
public void commit() {
editor.commit();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public SharedPreferencesUtil putStringSet(String key, Set<String> value) {
editor.putStringSet(key, value);
editor.commit();
return this;
}
public void putObject(String key, Object object) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = null;
try {
out = new ObjectOutputStream(baos);
out.writeObject(object);
String objectVal = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
editor.putString(key, objectVal);
editor.commit();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public <T> T getObject(String key, Class<T> clazz) {
if (prefs.contains(key)) {
String objectVal = prefs.getString(key, null);
byte[] buffer = Base64.decode(objectVal, Base64.DEFAULT);
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(bais);
T t = (T) ois.readObject();
return t;
} catch (StreamCorruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (bais != null) {
bais.close();
}
if (ois != null) {
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
public SharedPreferencesUtil remove(String key) {
editor.remove(key);
editor.commit();
return this;
}
public SharedPreferencesUtil removeAll() {
editor.clear();
editor.commit();
return this;
}
}
2.这时候呢可以在对应需要做黑夜模式界面的情况下做处理
private boolean mNowMode;
mNowMode = SharedPreferencesUtil.getInstance().getBoolean(Constant.ISNIGHT);
3.判断完之后需要对应的再onResume中做判断
@Override
protected void onResume() {
super.onResume();
if (SharedPreferencesUtil.getInstance().getBoolean(Constant.ISNIGHT, false) != mNowMode) {
if (SharedPreferencesUtil.getInstance().getBoolean(Constant.ISNIGHT, false)) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
resetActivity();
// recreate();
}
}
4.接下来是webview黑夜模式
控件点击变成黑夜模式具体方法如下:
public void changeWebViewMode()
{
if( !mNowMode )
{
try
{
if( dayCode == null )
{
InputStream is = getResources().openRawResource( R.raw.day );
byte[] buffer = new byte[is.available()];
is.read( buffer );
is.close();
dayCode = Base64.encodeToString( buffer , Base64.NO_WRAP );
}
webview.loadUrl(
"javascript:(function() {" + "var parent = document.getElementsByTagName('head').item(0);" + "var style = document.createElement('style');" + "style.type = 'text/css';" + "style.innerHTML = window.atob('" + dayCode + "');" + "parent.appendChild(style)" + "})();" );
}
catch( Exception e )
{
e.printStackTrace();
}
}
else
{
try
{
if( nightCode == null )
{
InputStream is = getResources().openRawResource( R.raw.night );
byte[] buffer = new byte[is.available()];
is.read( buffer );
is.close();
nightCode = Base64.encodeToString( buffer , Base64.NO_WRAP );
}
webview.loadUrl(
"javascript:(function() {" + "var parent = document.getElementsByTagName('head').item(0);" + "var style = document.createElement('style');" + "style.type = 'text/css';" + "style.innerHTML = window.atob('" + nightCode + "');" + "parent.appendChild(style)" + "})();" );
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
大家记得吧css文件放到raw文件夹下
day.css文件
div,section,ul,li,a,h1,h2,h3,p,link,textarea,form,select,input,span,button,em,menu,aside,table,tr,td,nav,img,dl,dt,dd, html, body,strong{
background:#ffffff !important;color:#222222!important;
border-color:#aaaaaa !important;
scrollbar-arrow-color:#333333 !important;
scrollbar-base-color:#dddddd !important;
scrollbar-shadow-color:#dddddd !important;
scrollbar-face-color:#dddddd !important;
scrollbar-highlight-color:#dddddd !important;
scrollbar-dark-shadow-color:#dddddd !important;
scrollbar-3d-light-color:#dddddd !important;
scrollbar-track-color:#dddddd !important;}
strong{display:block;}
a,a *{color:#222222 !important;text-decoration:none !important;}a:visited,a:visited *,a:active,a:active *{color:#aaaaaa !important;}
a:hover,a:hover *{color:#888888 !important;
background:#ffffff !important;}
input,select,option,button,textarea{color:#888888 !important;
background:#ffffff !important;
border:#aaaaaa !important;
border-color: #888888 #888888 #888888 #888888 !important;}
input:focus,select:focus,option:focus,button:focus,textarea:focus,input:hover,input[type=button],input[type=submit],input[type=reset],input[type=image] {border-color: #888888 #888888 #888888 #888888 !important;}
input[type=button]:focus,input[type=submit]:focus,input[type=reset]:focus,input[type=image]:focus, input[type=button]:hover,input[type=submit]:hover,input[type=reset]:hover,input[type=image]:hover {color:#888888 !important;background:#ffffff !important; border-color: #888888 #888888 #888888 #888888 !important;}
night.css
div,section,ul,li,a,h1,h2,h3,p,link,textarea,form,select,input,span,button,em,menu,aside,table,tr,td,nav,img,dl,dt,dd, html, body,strong{
background:#222222 !important;color:#888888!important;
border-color:#555555 !important;
scrollbar-arrow-color:#CCCCCC !important;
scrollbar-base-color:#222222 !important;
scrollbar-shadow-color:#222222 !important;
scrollbar-face-color:#222222 !important;
scrollbar-highlight-color:#222222 !important;
scrollbar-dark-shadow-color:#222222 !important;
scrollbar-3d-light-color:#222222 !important;
scrollbar-track-color:#222222 !important;}
strong{display:block;}
a,a *{color:#888888 !important;text-decoration:none !important;}a:visited,a:visited *,a:active,a:active *{color:#555555 !important;}
a:hover,a:hover *{color:#888888 !important;
background:#222222 !important;}
input,select,option,button,textarea{color:#888888 !important;
background:#222222 !important;
border:#555555 !important;
border-color: #888888 #888888 #888888 #888888 !important;}
input:focus,select:focus,option:focus,button:focus,textarea:focus,input:hover,input[type=button],input[type=submit],input[type=reset],input[type=image] {border-color: #888888 #888888 #888888 #888888 !important;}
input[type=button]:focus,input[type=submit]:focus,input[type=reset]:focus,input[type=image]:focus, input[type=button]:hover,input[type=submit]:hover,input[type=reset]:hover,input[type=image]:hover {color:#888888 !important;background:#222222 !important; border-color: #888888 #888888 #888888 #888888 !important;}
;