Android – standard mørk tilstand
Jeg vil implementere i min app Dark mode. Som standard ville jeg ønske, at det blev fulgt af systemet, så i Hovedaktivitet har jeg placeret:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
Det fungerer fint, men hvis brugeren vil ombestemme sig og vælge en bestemt indstilling i min app-menu for at slå mørk tilstand til/fra, genstarter aktiviteten, og app'en følger stadig systemregler. Hvordan kan jeg ændre det?
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_color_mode) { if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); else AppCompatDelegate.setDefaultNightMode( AppCompatDelegate.MODE_NIGHT_YES); return true; }
Svar
Koden, der er ansvarlig for den mulighed, du nævnte, er i onCreate(). Mekanisme, der tillader brugeren at ændre tilstand, er ikke inden for onCreate()
public class MainActivityextends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } }
Når du eksplicit ændrer den mørke tilstand, genskaber Android aktiviteten og kalder derfor onCreate
igen.
Så efter at du har ændret den mørke tilstand, vil du ikke bemærke en ændring, som AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
kaldes igen, når onCreate
kaldes af systemet.
For at få dette til at virke kan du gemme en værdi i SharedPreference
der kan tjekkes ind i onCreate
før du indstiller systemets mørke tilstand.
Dette kan være en boolsk værdi, som du kan skifte til, når du manuelt vil ændre den mørke tilstand.
Her er et eksempel
public class MainActivityextends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); boolean isSystem = prefs.getBoolean("IS_SYSTEM", true); if (isSystem) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_color_mode) { if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); else AppCompatDelegate.setDefaultNightMode( AppCompatDelegate.MODE_NIGHT_YES); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); prefs.edit().putBoolean("IS_SYSTEM", false).apply(); return true; } }
OPDATERING
det fungerer perfekt, men når jeg afslutter applikationen og derefter starter igen, er standard systemtilstand aktiv, selvom jeg har skiftet den. Er det muligt her at få det til at fungere på den måde?
Du kan bruge en anden SharedPreference
boolesk til at blive gemt permanent
public class MainActivityextends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); boolean isSystem = prefs.getBoolean("IS_SYSTEM", true); boolean isNight = prefs.getBoolean("IS_NIGHT", false); if (isSystem) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } else if (isNight) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); } else { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_color_mode) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); prefs.edit().putBoolean("IS_NIGHT", false).apply(); } else { AppCompatDelegate.setDefaultNightMode( AppCompatDelegate.MODE_NIGHT_YES); prefs.edit().putBoolean("IS_NIGHT", true).apply(); } prefs.edit().putBoolean("IS_SYSTEM", false).apply(); return true; } }