package skin.support.app; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.LayoutInflaterCompat; import android.support.v7.app.AppCompatActivity; import skin.support.SkinCompatManager; import skin.support.content.res.SkinCompatResources; import skin.support.observe.SkinObservable; import skin.support.observe.SkinObserver; import skin.support.widget.SkinCompatThemeUtils; import static skin.support.widget.SkinCompatHelper.INVALID_ID; import static skin.support.widget.SkinCompatHelper.checkResourceId; /** * Created by ximsfei on 17-1-8. */ public class SkinCompatActivity extends AppCompatActivity implements SkinObserver { private SkinCompatDelegate mSkinDelegate; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { LayoutInflaterCompat.setFactory(getLayoutInflater(), getSkinDelegate()); super.onCreate(savedInstanceState); updateStatusBarColor(); updateWindowBackground(); } @NonNull public SkinCompatDelegate getSkinDelegate() { if (mSkinDelegate == null) { mSkinDelegate = SkinCompatDelegate.create(this); } return mSkinDelegate; } @Override protected void onResume() { super.onResume(); SkinCompatManager.getInstance().addObserver(this); } @Override protected void onDestroy() { super.onDestroy(); SkinCompatManager.getInstance().deleteObserver(this); } /** * @return true: 打开5.0以上状态栏换肤, false: 关闭5.0以上状态栏换肤; */ protected boolean skinStatusBarColorEnable() { return true; } protected void updateStatusBarColor() { if (skinStatusBarColorEnable() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { int statusBarColorResId = SkinCompatThemeUtils.getStatusBarColorResId(this); int colorPrimaryDarkResId = SkinCompatThemeUtils.getColorPrimaryDarkResId(this); if (checkResourceId(statusBarColorResId) != INVALID_ID) { getWindow().setStatusBarColor(SkinCompatResources.getInstance().getColor(statusBarColorResId)); } else if (checkResourceId(colorPrimaryDarkResId) != INVALID_ID) { getWindow().setStatusBarColor(SkinCompatResources.getInstance().getColor(colorPrimaryDarkResId)); } } } protected void updateWindowBackground() { int windowBackgroundResId = SkinCompatThemeUtils.getWindowBackgroundResId(this); if (checkResourceId(windowBackgroundResId) != INVALID_ID) { String typeName = getResources().getResourceTypeName(windowBackgroundResId); if ("color".equals(typeName)) { Drawable drawable = new ColorDrawable(SkinCompatResources.getInstance().getColor(windowBackgroundResId)); getWindow().setBackgroundDrawable(drawable); } else if ("drawable".equals(typeName)) { Drawable drawable = SkinCompatResources.getInstance().getDrawable(windowBackgroundResId); getWindow().setBackgroundDrawable(drawable); } else if ("mipmap".equals(typeName)) { Drawable drawable = SkinCompatResources.getInstance().getMipmap(windowBackgroundResId); getWindow().setBackgroundDrawable(drawable); } } } @Override public void updateSkin(SkinObservable observable, Object o) { updateStatusBarColor(); updateWindowBackground(); getSkinDelegate().applySkin(); } }