заставить темный режим в android не отвечать - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь реализовать темную тему, как описано здесь . Итак, я создал arrays.xml как:

<resources>
  <array name="themes_labels">
    <item>"Default"</item>
    <item>"Light"</item>
    <item>"Dark"</item>
  </array>

  <string-array name="themes_color">
    <item>"Default"</item>
    <item>"Light"</item>
    <item>"Dark"</item>
  </string-array>
</resources>

, и это мой код для изменения темы, которая не работает, т.е. тема не меняется, хотя первый тост дает правильное значение где 2-й тост перед переключателем дает какое-то загадочное значение, например 16/32 et c.

Я понимаю, что мой массив значений является ключевым, где я пытаюсь прочитать некоторое значение int в переключателе. Но я не понимаю, как это получить.

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String theme = sharedPref.getString("theme", "Default");
Toast.makeText(this, theme, Toast.LENGTH_LONG).show();
int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
Toast.makeText(this, ""+currentNightMode, Toast.LENGTH_LONG).show();
switch (currentNightMode) {
  case Configuration.UI_MODE_NIGHT_NO:
    // Night mode is not active, we're using the light theme
    break;
  case Configuration.UI_MODE_NIGHT_YES:
    // Night mode is active, we're using dark theme
    break;
    default:
      AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}

1 Ответ

0 голосов
/ 03 февраля 2020

Попробуйте использовать код темного режима, который я использую.

Шаг - 1

Сначала создайте папку night в файле ресурсов, как ниже изображения (то есть значения-ночь)

Create night mode folder

Шаг - 2

Создание стилей, строки и цвета xml файл для ночного режима такой же, как на изображении ниже, и добавьте цвет, строку и стиль ночного режима, которые вы хотите отображать в своем приложении, когда был применен ночной режим.

Create night mode xml files

Шаг - 3

Добавьте этот код ниже на экране spla sh, если хотите установить ночной режим в соответствии с режимом устройства в первый раз, когда установлено приложение.

@Override
protected void onCreate(Bundle savedInstanceState) {
    if (!CommonUtils.isToogleEnabled(SplashActivity.this)) {
        if (CommonUtils.isDarkMode(SplashActivity.this)) {
            CommonUtils.setIsNightModeEnabled(SplashActivity.this, true);
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else {
            CommonUtils.setIsNightModeEnabled(SplashActivity.this, false);
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }
    } else {
        if (CommonUtils.isNightModeEnabled(SplashActivity.this)) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }
    }
    super.onCreate(savedInstanceState);

    ...
    //your code
}

Шаг - 4

Добавить этот код ниже во все ваши действия

@Override
protected void onCreate(Bundle savedInstanceState) {
    if (CommonUtils.isNightModeEnabled(MainActivity.this)) {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    } else {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    }
    super.onCreate(savedInstanceState);

    ...
    //your code
}

Шаг - 5

Изменение режима с использованием приведенного ниже кода

private WeakReference<Activity> mActivity;

binding.imgNightMode.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mActivity = new WeakReference<Activity>(MainActivity.this);
        CommonUtils.setIsToogleEnabled(MainActivity.this, true);
        if (CommonUtils.isNightModeEnabled(MainActivity.this)) {
            CommonUtils.setIsNightModeEnabled(MainActivity.this, false);
            mActivity.get().recreate();
        } else {
            CommonUtils.setIsNightModeEnabled(MainActivity.this, true);
            mActivity.get().recreate();
        }
    }
});

Ниже приведены методы CommonUtils .

private static final String NIGHT_MODE = "NIGHT_MODE";
private static final String TOOGLE = "TOOGLE";

public static boolean isNightModeEnabled(Context context) {
    SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
    return mPrefs.getBoolean(NIGHT_MODE, false);
}

public static void setIsNightModeEnabled(Context context, boolean isNightModeEnabled) {
    SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
    SharedPreferences.Editor editor = mPrefs.edit();
    editor.putBoolean(NIGHT_MODE, isNightModeEnabled);
    editor.apply();
}

public static void setIsToogleEnabled(Context context, boolean isToogleEnabled) {
    SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
    SharedPreferences.Editor editor = mPrefs.edit();
    editor.putBoolean(TOOGLE, isToogleEnabled);
    editor.apply();
}

public static boolean isToogleEnabled(Context context) {
    SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
    return mPrefs.getBoolean(TOOGLE, false);
}

public static boolean isDarkMode(Activity activity) {
    return (activity.getResources().getConfiguration()
            .uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
}

Надеюсь, это поможет вам!

Спасибо.

...