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 @@ 内容审核中 关注的人 + background_id + text_color_id +