Постоянные логические значения 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" />
Я не уверен, что:
Логическое значение сохраняется.
Переключатель может быть отредактирован внутри кода 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);
}