diff --git a/app/src/main/java/com/gh/base/BaseActivity.java b/app/src/main/java/com/gh/base/BaseActivity.java index 31be11e488..590b0b1ed2 100644 --- a/app/src/main/java/com/gh/base/BaseActivity.java +++ b/app/src/main/java/com/gh/base/BaseActivity.java @@ -16,6 +16,7 @@ import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.View; +import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.LinearLayout; @@ -24,6 +25,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; +import androidx.core.view.LayoutInflaterCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.Lifecycle; @@ -70,7 +72,7 @@ import kotlin.Pair; import pub.devrel.easypermissions.EasyPermissions; /** - * 只提供基础的服务(EventBus/ButterKnife/Share/GlobalDialog/Permissions) + * 只提供基础的服务(EventBus/Share/GlobalDialog/Permissions) *
* 需要工具栏的页面请继承{@link ToolBarActivity}
*/
@@ -130,6 +132,11 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
@Override
protected void onCreate(Bundle savedInstanceState) {
+ // TODO 添加 nightMode 较高性能的开关来避免无用调用
+ if (isAutoResetViewBackgroundEnabled()) {
+ LayoutInflaterCompat.setFactory2(getLayoutInflater(), new CustomLayoutInflaterFactory(this));
+ }
+
super.onCreate(savedInstanceState);
if (useEventBus()) EventBus.getDefault().register(this);
@@ -530,5 +537,51 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
tv.setText(NightModeUtils.INSTANCE.isNightMode(this) ? "夜间模式" : "日间模式");
tv.setAlpha(NightModeUtils.INSTANCE.isNightMode(this) ? 0.8F : 0.15F);
}
+ if (isAutoResetViewBackgroundEnabled()) {
+ updateStaticViewBackground(getWindow().getDecorView());
+ }
}
+
+ protected boolean isAutoResetViewBackgroundEnabled() {
+ return false;
+ }
+
+ /**
+ * 自动重置部分 view 的背景颜色/资源
+ * @param view 父 view
+ */
+ private void updateStaticViewBackground(View view) {
+ if (view instanceof ViewGroup) {
+ for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
+ View child = ((ViewGroup) view).getChildAt(i);
+ updateStaticViewBackground(child);
+ }
+ }
+
+ String backgroundString = (String) view.getTag(CustomLayoutInflaterFactory.TAG_BACKGROUND_ID);
+ String textColorString = (String) view.getTag(CustomLayoutInflaterFactory.TAG_TEXT_COLOR_ID);
+ if (backgroundString != null) {
+ int backgroundId = Integer.parseInt(backgroundString.replace("@", ""));
+
+ if (backgroundId != 0) {
+ TypedValue value = new TypedValue();
+ getResources().getValue(backgroundId, value, true);
+
+ if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT && value.type <= TypedValue.TYPE_LAST_COLOR_INT) {
+ view.setBackgroundColor(ExtensionsKt.toColor(backgroundId, this));
+ } else {
+ view.setBackground(ExtensionsKt.toDrawable(backgroundId, this));
+ }
+ }
+ }
+
+ if (textColorString != null && view instanceof TextView) {
+ int textColorId = Integer.parseInt(textColorString.replace("@", ""));
+
+ if (textColorId != 0) {
+ ((TextView) view).setTextColor(ExtensionsKt.toColor(textColorId, this));
+ }
+ }
+ }
+
}
diff --git a/app/src/main/java/com/gh/base/CustomLayoutInflaterFactory.kt b/app/src/main/java/com/gh/base/CustomLayoutInflaterFactory.kt
new file mode 100644
index 0000000000..d8c2ce3061
--- /dev/null
+++ b/app/src/main/java/com/gh/base/CustomLayoutInflaterFactory.kt
@@ -0,0 +1,48 @@
+package com.gh.base
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import com.gh.gamecenter.R
+
+class CustomLayoutInflaterFactory(
+ private val mAppCompatActivity: AppCompatActivity
+) : LayoutInflater.Factory2 {
+
+ override fun onCreateView(
+ parent: View?,
+ name: String,
+ context: Context,
+ attrs: AttributeSet
+ ): View? {
+
+ val view = mAppCompatActivity.delegate.createView(parent, name, context, attrs)
+ ?: mAppCompatActivity.onCreateView(parent, name, context, attrs)
+ ?: mAppCompatActivity.layoutInflater.createView(name,null, attrs)
+
+ val n = attrs.attributeCount
+ for (i in 0 until n) {
+ val attributeName = attrs.getAttributeName(i).toString()
+ if (attributeName.contains("background")) {
+ view?.setTag(TAG_BACKGROUND_ID, attrs.getAttributeValue(i))
+ } else if (attributeName.contains("textColor")) {
+ view?.setTag(TAG_TEXT_COLOR_ID, attrs.getAttributeValue(i))
+ }
+ }
+
+ return view
+ }
+
+ override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? {
+ return mAppCompatActivity.onCreateView(name, context, attrs)
+ }
+
+ companion object {
+ const val TAG = "CustomLayoutInflaterFactory"
+ const val TAG_BACKGROUND_ID = R.string.background_id
+ const val TAG_TEXT_COLOR_ID = R.string.text_color_id
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a278a027be..148b5c4f92 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -856,6 +856,9 @@