2016-04-23 32 views
0

テーマを変更して優先度を変更しました。暗いテーマ、原色、アクセントの色を変更しました。暗いテーマを選択すると、アプリ全体ではなく、原色やアクセントの色も変化しません。 コードを以下に示します。テーマがアンドロイドで動作しません

activity.java

import android.annotation.SuppressLint; 
import android.os.Bundle;; 
import android.preference.PreferenceFragment; 
import android.support.annotation.ColorInt; 
import android.support.annotation.NonNull; 
import android.support.v7.widget.Toolbar; 
import android.view.MenuItem; 
import com.afollestad.materialdialogs.color.ColorChooserDialog; 
import com.dps.brt.Widget.Preference; 
import com.dps.brt.Widget.Utils; 

public class SettingActivity extends ThemedActivity implements ColorChooserDialog.ColorCallback{ 
@Override 
protected int darkTheme() { 
    return R.style.AppThemeDark; 
} 

@Override 
protected int lightTheme() { 
    return R.style.AppTheme; 
} 

@SuppressLint("CommitPrefEdits") 
public void onColorSelection(@NonNull ColorChooserDialog colorChooserDialog, @ColorInt int color) { 
    if (colorChooserDialog.isAccentMode()) { 
     accentColor(color); 
    } else { 
     primaryColor(color); 
    } 
    recreate(); 
} 
@Override 
protected void onResume() { 
    super.onResume(); 
    boolean darkTheme = isDarkTheme(); 
    int primaryColor = primaryColor(); 
    int accentColor = accentColor(); 
} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.setting); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    toolbar.setTitle("Setting"); 
    toolbar.setTitleTextColor(0xFFFFFFFF); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true); 
    if (savedInstanceState == null) { 
     getFragmentManager().beginTransaction().replace(R.id.tc, new SettingsFragment()).commit(); 
    } 

} 
public static class SettingsFragment extends PreferenceFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.theme); 
     findPreference("dark_theme").setOnPreferenceChangeListener(new android.preference.Preference.OnPreferenceChangeListener() { 
      @Override 
      public boolean onPreferenceChange(android.preference.Preference preference, Object newValue) { 
       if (getActivity() != null) { 
        getActivity().recreate(); 
       } 
       return true; 
      } 
     }); 
     Preference primaryColor = (Preference) findPreference("primary_color"); 
     primaryColor.setColor(((ThemedActivity) getActivity()).primaryColor(), Utils.resolveColor(getActivity(), R.attr.colorAccent)); 
     primaryColor.setOnPreferenceClickListener(new android.preference.Preference.OnPreferenceClickListener() { 
      @Override 
      public boolean onPreferenceClick(android.preference.Preference preference) { 
       SettingActivity act = (SettingActivity) getActivity(); 
       if (act == null) { 
        return false; 
       } 
       new ColorChooserDialog.Builder(act, preference.getTitleRes()) 
         .preselect(act.primaryColor()) 
         .backButton(R.string.back) 
         .doneButton(R.string.done) 
         .cancelButton(android.R.string.cancel) 
         .show(); 
       return true; 
      } 
     }); 


     Preference accentColor = (Preference) findPreference("accent_color"); 
     accentColor.setColor(((ThemedActivity) getActivity()).accentColor(), Utils.resolveColor(getActivity(), R.attr.colorAccent)); 
     accentColor.setOnPreferenceClickListener(new android.preference.Preference.OnPreferenceClickListener() { 
      @Override 
      public boolean onPreferenceClick(android.preference.Preference preference) { 
       SettingActivity act = (SettingActivity) getActivity(); 
       if (act == null) { 
        return false; 
       } 
       new ColorChooserDialog.Builder(act, preference.getTitleRes()) 
         .preselect(act.accentColor()) 
         .accentMode(true) 
         .backButton(R.string.back) 
         .doneButton(R.string.done) 
         .cancelButton(android.R.string.cancel) 
         .show(); 
       return true; 
      } 
     }); 
    } 

} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == android.R.id.home) {SettingActivity.this.finish(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

ベースのテーマ活動を設定

import android.annotation.TargetApi; 
import android.app.ActivityManager; 
import android.content.res.ColorStateList; 
import android.graphics.BitmapFactory; 
import android.graphics.Color; 
import android.graphics.drawable.ColorDrawable; 
import android.os.Build; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.support.annotation.ColorInt; 
import android.support.annotation.FloatRange; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import com.afollestad.materialdialogs.internal.ThemeSingleton; 
import com.dps.brt.Widget.PrefUtils; 

public abstract class ThemedActivity extends AppCompatActivity { 

private boolean mLastDarkTheme; 
private int mLastPrimaryColor; 
private int mLastAccentColor; 

@ColorInt 
public static int shiftColor(@ColorInt int color, @FloatRange(from = 0.0f, to = 2.0f) float by) { 
    if (by == 1f) { 
     return color; 
    } 
    float[] hsv = new float[3]; 
    Color.colorToHSV(color, hsv); 
    hsv[2] *= by; // value component 
    return Color.HSVToColor(hsv); 
} 

@ColorInt 
public static int shiftColorDown(@ColorInt int color) { 
    return shiftColor(color, 0.9f); 
} 

protected int darkTheme() { 
    return R.style.AppThemeDark; 
} 

protected int lightTheme() { 
    return R.style.AppTheme; 
} 

public boolean isDarkTheme() { 
    return PreferenceManager.getDefaultSharedPreferences(this).getBoolean(PrefUtils.DARK_THEME, false); 
} 

public int primaryColor() { 
    String key = PrefUtils.PRIMARY_COLOR_PREFIX; 
    if (mLastDarkTheme) { 
     key += "_dark"; 
    } else { 
     key += "_light"; 
    } 
    final int defaultColor = ContextCompat.getColor(this, mLastDarkTheme ? 
      R.color.dark_theme_gray : R.color.material_indigo_500); 
    return PreferenceManager.getDefaultSharedPreferences(this).getInt(key, defaultColor); 
} 

protected void primaryColor(int newColor) { 
    String key = PrefUtils.PRIMARY_COLOR_PREFIX; 
    if (mLastDarkTheme) { 
     key += "_dark"; 
    } else { 
     key += "_light"; 
    } 
    PreferenceManager.getDefaultSharedPreferences(this).edit().putInt(key, newColor).apply(); 
} 

public int primaryColorDark() { 
    return shiftColorDown(primaryColor()); 
} 

public int accentColor() { 
    String key = PrefUtils.ACCENT_COLOR_PREFIX; 
    if (mLastDarkTheme) { 
     key += "_dark"; 
    } else { 
     key += "_light"; 
    } 
    final int defaultColor = ContextCompat.getColor(this, R.color.material_pink_500); 
    return PreferenceManager.getDefaultSharedPreferences(this).getInt(key, defaultColor); 
} 

protected void accentColor(int newColor) { 
    String key = PrefUtils.ACCENT_COLOR_PREFIX; 
    if (mLastDarkTheme) { 
     key += "_dark"; 
    } else { 
     key += "_light"; 
    } 
    PreferenceManager.getDefaultSharedPreferences(this).edit().putInt(key, newColor).apply(); 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    mLastDarkTheme = isDarkTheme(); 
    mLastPrimaryColor = primaryColor(); 
    mLastAccentColor = accentColor(); 
    ColorStateList sl = ColorStateList.valueOf(mLastAccentColor); 
    ThemeSingleton.get().positiveColor = sl; 
    ThemeSingleton.get().neutralColor = sl; 
    ThemeSingleton.get().negativeColor = sl; 
    ThemeSingleton.get().widgetColor = mLastAccentColor; 
    setTheme(mLastDarkTheme ? darkTheme() : lightTheme()); 
    super.onCreate(savedInstanceState); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     // Sets color of entry in the system recents page 
     ActivityManager.TaskDescription td = new ActivityManager.TaskDescription(
       getString(R.string.app_name), 
       BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher), 
       primaryColor()); 
     setTaskDescription(td); 
    } 

    if (getSupportActionBar() != null) { 
     getSupportActionBar().setBackgroundDrawable(new ColorDrawable(primaryColor())); 
    } 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && hasColoredBars()) { 
     final int dark = primaryColorDark(); 
     if (allowStatusBarColoring()) { 
      getWindow().setStatusBarColor(dark); 
     } else { 
      getWindow().setStatusBarColor(ContextCompat.getColor(this, android.R.color.transparent)); 
     } 
    } 
} 

protected boolean allowStatusBarColoring() { 
    return false; 
} 

protected boolean hasColoredBars() { 
    return true; 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    boolean darkTheme = isDarkTheme(); 
    int primaryColor = primaryColor(); 
    int accentColor = accentColor(); 
} 
} 

答えて

0

あなたが主な活動でrecreate()を呼び出す必要があるからです。あなたが指定したコードでは、テーマが正しく適用される設定アクティビティでrecreate()と呼ばれます。メインアクティビティに戻ると、再作成されずに再開されるだけなので、テーマは適用されません。 onCreate()は呼び出されません。

関連する問題