2015-04-11 2 views
0

Я прокрутил по сети (включая 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" /> 

Я не уверен, если:

  1. Булево значение сохраняется.

  2. Коммутатор можно редактировать внутри java-кода.

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

ответ

0

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

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

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

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

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

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

Для записи значения:

вызова редактирования(), чтобы получить 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); 
} 
+0

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

+0

Я не понимаю, что вы имеете в виду, где их разместить. Вы можете просто получить редактор SharedPreferences из контекста (Activity extends Context) и сохранить или извлечь из него значения. Множество примеров можно найти в Интернете, например здесь: http://stackoverflow.com/a/23024962/2947592 – wvdz

+0

Хорошо, теперь я вижу вашу проблему. Вы, за исключением значения, которое будет автоматически указано в вашем файле savedInstanceState, но вам нужно сделать некоторую работу для этого. Если вы хотите сделать значение постоянным в течение нескольких жизненных циклов приложений, вам не нужно ничего делать с сохраненнымInstanceState. Просто используйте sharedPreferences в слушателе вашего коммутатора, чтобы сохранить значение сразу после его установки, и в логике инициализации коммутатора установить его в сохраненное значение. – wvdz

 Смежные вопросы

  • Нет связанных вопросов^_^