Постоянные логические значения Android Studio

Я копался в Интернете (включая SO) и нашел много информации о наличии постоянных данных. Я нашел строки, целые, двойные, календари, почти все. Те, для которых я не видел конкретного руководства или учебника, являются логическими.

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

У меня есть переключатель для работы, где он включает вибрацию в зависимости от того, в каком положении находится переключатель. Кажется, я не могу заставить переключатель оставаться в выключенном положении, когда приложение создается заново.

Вот мой код для сохранения:

@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.activity_main);
    dBell = MediaPlayer.create(this, R.raw.doorbell);
    if ((bundle != null) && (bundle.getBoolean("vibetoggle") != false)) {
        vibeOn = false;
    } else {
        vibeOn = true;
    }

}

protected void onRestoreInstanceState(Bundle bundle) {
    super.onRestoreInstanceState(bundle);
    vibeOn = bundle.getBoolean("vibetoggle");
}

protected void onSaveInstanceState(Bundle bundle) {
    super.onSaveInstanceState(bundle);
    bundle.putBoolean("vibetoggle", vibeOn);
}

public void onToggleClicked(View view) {
    Vibrator vibe = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    vibeOn = ((Switch) view).isChecked();
    if (vibeOn) {
        vibe.vibrate(100);
    } else {
        // No vibrate
    }
}

public void playSound(View view) {
    dBell.start();
    if (vibeOn) {
        Vibrator vibe = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        vibe.vibrate(300);
    } else {
        // No vibrate
    }
}

Более короткое время вибрации (100 мс) происходит, когда переключатель переключается с отключенного на включенное. Чем длиннее тот, который фактически вызывает вибрации кнопки при нажатии.

Я как бы заставил работать булеву логику, но переключатель IO все равно будет установлен в значение по умолчанию и не будет работать правильно, пока не будет переключен. Проблема, с которой я столкнулся в отношении переключателя, заключается в том, что я хочу, чтобы переключатель был в правильном положении при загрузке (т. Е. Если логическое значение сохранено как false, то переключатель будет загружен в положение выключения). Я не могу понять, как заставить обоих общаться. Я бы предположил, что переключатель должен будет меняться в зависимости от логического значения, а не наоборот. Я просто не могу понять, как заставить коммутатор xml общаться с тем, что есть у меня в Java и наоборот.

Вот код xml для коммутатора:

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Vibration"
    android:id="@+id/switch1"
    android:layout_alignBottom="@+id/dBellButton"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:clickable="true"
    android:checked="true"
    android:onClick="onToggleClicked" />

Я знаю android:checked="true" вызывает переключение в положение по умолчанию на. Я попытался сделать новый логический внутри значений XML (а не код, говорящий android:checked="true", он сказал бы что-то вроде android:checked="@bool/vibeConvert), но обнаружил, что я не знал, как редактировать логическое значение с помощью Java, когда он был там.

Я пробовал несколько разных способов, чтобы эти данные были постоянными, но ни один из них не помог мне. Если бы я мог получить некоторую помощь с постоянными данными, особенно в отношении логических значений, это было бы здорово.

РЕДАКТИРОВАТЬ: показывает мою попытку использовать SharedPreferences.

protected void onRestoreInstanceState(Bundle bundle) {
    super.onRestoreInstanceState(bundle);
    vibeOn = bundle.getBoolean("vibetoggle");
//        preferenceSettings = getPreferences(PREFERENCE_MODE_PRIVATE);
//        vibeOn = preferenceSettings.getBoolean("on", true);
}

protected void onSaveInstanceState(Bundle bundle) {
    super.onSaveInstanceState(bundle);
    bundle.putBoolean("vibetoggle", vibeOn);
//        preferenceSettings = getPreferences(PREFERENCE_MODE_PRIVATE);
//        preferenceEditor = preferenceSettings.edit();
//        preferenceEditor.putBoolean("on", vibeOn);
//        preferenceEditor.apply();
}

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

Спасибо!

Натан

РЕДАКТИРОВАТЬ:

Я попытался использовать следующий код:

public static final String PREFS_NAME = "MyPrefsFile";
MediaPlayer dBell;
boolean vibeOn;

@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.activity_main);
    dBell = MediaPlayer.create(this, R.raw.doorbell);

    // Restore preferences
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    boolean vibeSave = settings.getBoolean("vibeSave", vibeOn);
    vibeOn = vibeSave;
    Switch ("+id/switch1") = vibeSave;
}

@Override
protected void onStop() {
    super.onStop();

    // Let Editor make preference changes
    // All objects are from android.context.Context
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean("vibeSave", vibeOn);
    editor.commit();
}

Вот мой XML:

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Vibration"
    android:id="@+id/switch1"
    android:layout_alignBottom="@+id/dBellButton"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:clickable="true"
    android:checked="true"
    android:onClick="onToggleClicked" />

Я не уверен, что:

  1. Логическое значение сохраняется.

  2. Переключатель может быть отредактирован внутри кода Java.

Я попытался поиграть с идеей с помощью следующей строки кода: Switch ("+id/switch1") = vibeSave;, но это не сработало. Я не уверен, что делать дальше. Я хочу, чтобы мой XML мог начинаться в правильной позиции на основе значения в логическом значении, но я не уверен, как заставить мой XML и мой Java общаться друг с другом.

1 ответ

Решение

Вы можете использовать SharedPreferences для хранения примитивных значений.

Лучшее место для этого - сразу после изменения значения.

Поэтому добавьте сохранение в логику вашего слушателя коммутатора и загрузку в логику инициализатора вашего коммутатора.

Чтобы получить объект SharedPreferences для вашего приложения, используйте один из двух методов:

getSharedPreferences () - Используйте это, если вам нужно несколько файлов предпочтений, идентифицируемых по имени, которое вы указываете в первом параметре.

getPreferences () - Используйте это, если вам нужен только один файл настроек для вашей активности. Поскольку это будет единственный файл настроек для вашей Деятельности, вы не предоставите имя.

Чтобы записать значения:

Вызовите edit(), чтобы получить SharedPreferences.Editor.

Добавьте значения с помощью таких методов, как putBoolean() и putString().

Зафиксируйте новые значения с помощью commit()

Чтобы прочитать значения, используйте методы SharedPreferences, такие как getBoolean() и getString().

Код в вашем onCreate должен выглядеть примерно так:

@Override
protected void onCreate(Bundle bundle) {
    (...)
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    boolean vibeSave = settings.getBoolean("vibeSave", false);
    Switch switch = (Switch) findViewById(R.id.switch1);
    switch.setChecked(vibeSave);
}
Другие вопросы по тегам