Я прокрутил по сети (включая SO) и нашел много информации о наличии постоянных данных. Я нашел строки, ints, парные, календари, почти все. Я не видел конкретного руководства или учебника для booleans.Стойкие булевы Android Studio
Я создал приложение, у которого есть переключатель, расположенный на основной деятельности. У меня нет кнопки настроек, окна или даже панели, потому что все приложение доступно из основного действия. Я хочу, чтобы коммутатор был постоянным, а также его последствия (т. Е. Когда приложение закрыто, оно будет помнить, отключает ли пользователь или активирует функцию вибрирования).
У меня есть переключатель для работы там, где он активирует вибрацию в зависимости от того, в каком положении находится переключатель. Кажется, я не могу заставить переключатель оставаться в выключенном положении, когда приложение воссоздается.
Вот мой код, чтобы сохранить:
@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, когда оно было там также.
Я пробовал несколько разных методов, чтобы эти данные были постоянными, но ни один из них не работал для меня. Если бы я мог получить некоторую помощь с постоянными данными, в частности относительно булевых, это было бы фантастически.
EDIT: показывает мою попытку использования 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, и я не мог найти где-нибудь, которые указаны, где разместить их. Они прокомментированы здесь по понятным причинам. Не уверен, куда идти отсюда.
Спасибо!
Натан
EDIT:
Я попытался, используя следующий код:
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-разговор друг с другом.
Я не совсем уверен, куда поместить эти объекты SharedPreference. Я уже пробовал их, и я могу связать их, чтобы показать, что я использовал. Я попробовал их, прежде чем опубликовать это, но не смог заставить их работать ... Я добавлю то, что я сделал, и где я разместил их на оригинальной записи. –
Я не понимаю, что вы имеете в виду, где их разместить. Вы можете просто получить редактор SharedPreferences из контекста (Activity extends Context) и сохранить или извлечь из него значения. Множество примеров можно найти в Интернете, например здесь: http://stackoverflow.com/a/23024962/2947592 – wvdz
Хорошо, теперь я вижу вашу проблему. Вы, за исключением значения, которое будет автоматически указано в вашем файле savedInstanceState, но вам нужно сделать некоторую работу для этого. Если вы хотите сделать значение постоянным в течение нескольких жизненных циклов приложений, вам не нужно ничего делать с сохраненнымInstanceState. Просто используйте sharedPreferences в слушателе вашего коммутатора, чтобы сохранить значение сразу после его установки, и в логике инициализации коммутатора установить его в сохраненное значение. – wvdz