日夜モードの切り替え

11185 ワード

ネットで何日間の夜間モードの切り替えの方法を見ましたが、大体3種類です。もっともいいのは反射によって達成されることです。参照リンク:http://yuqirong.me/2016/09/08/Androidのナイトモード実現についての検討/
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);
    }
}