持久布尔值 Android Studio
Persistent booleans Android Studio
我一直在网上搜索(包括 SO),并找到了很多关于拥有持久数据的信息。我找到了字符串、整数、双打、日历,几乎所有东西。我没有看到具体指南或教程的是布尔值。
我创建了一个应用程序,它在主 activity 上有一个开关。我没有设置按钮 window,甚至没有窗格,因为整个应用程序都是从主 activity 访问的。我想让开关保持持久性以及它所具有的影响(即,当应用程序关闭时,它会记住用户是否禁用或启用振动功能)。
我有开关工作,它确实启用了振动,具体取决于开关所在的位置。我似乎无法在重新创建应用程序时让开关保持在关闭位置。
这是我要保存的代码:
@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
}
}
当开关从禁用状态切换到启用状态时,会出现较短的振动持续时间 (100ms)。较长的是实际导致按钮在单击时振动的原因。
我已经让布尔逻辑起作用了,但 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 编辑布尔值。
我尝试了几种不同的方法来使这些数据持久化,但是 none 对我有用。如果我能在持久数据方面获得一些帮助,特别是关于布尔值,那就太好了。
编辑:显示我尝试使用 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 相互对话其他.
您可以使用 SharedPreferences 来存储原始值。
执行此操作的最佳位置是在更改值之后。
因此将保存添加到您的开关侦听器逻辑中,并将加载添加到您的开关初始化器逻辑中。
To get a SharedPreferences object for your application, use one of two
methods:
getSharedPreferences() - Use this if you need multiple preferences
files identified by name, which you specify with the first parameter.
getPreferences() - Use this if you need only one preferences file for
your Activity. Because this will be the only preferences file for your
Activity, you don't supply a name.
To write values:
Call edit() to get a SharedPreferences.Editor.
Add values with methods such as putBoolean() and putString().
Commit the new values with commit()
To read values, use SharedPreferences methods such as getBoolean() and 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);
}
我一直在网上搜索(包括 SO),并找到了很多关于拥有持久数据的信息。我找到了字符串、整数、双打、日历,几乎所有东西。我没有看到具体指南或教程的是布尔值。
我创建了一个应用程序,它在主 activity 上有一个开关。我没有设置按钮 window,甚至没有窗格,因为整个应用程序都是从主 activity 访问的。我想让开关保持持久性以及它所具有的影响(即,当应用程序关闭时,它会记住用户是否禁用或启用振动功能)。
我有开关工作,它确实启用了振动,具体取决于开关所在的位置。我似乎无法在重新创建应用程序时让开关保持在关闭位置。
这是我要保存的代码:
@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
}
}
当开关从禁用状态切换到启用状态时,会出现较短的振动持续时间 (100ms)。较长的是实际导致按钮在单击时振动的原因。
我已经让布尔逻辑起作用了,但 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 编辑布尔值。
我尝试了几种不同的方法来使这些数据持久化,但是 none 对我有用。如果我能在持久数据方面获得一些帮助,特别是关于布尔值,那就太好了。
编辑:显示我尝试使用 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 相互对话其他.
您可以使用 SharedPreferences 来存储原始值。
执行此操作的最佳位置是在更改值之后。
因此将保存添加到您的开关侦听器逻辑中,并将加载添加到您的开关初始化器逻辑中。
To get a SharedPreferences object for your application, use one of two methods:
getSharedPreferences() - Use this if you need multiple preferences files identified by name, which you specify with the first parameter.
getPreferences() - Use this if you need only one preferences file for your Activity. Because this will be the only preferences file for your Activity, you don't supply a name.
To write values:
Call edit() to get a SharedPreferences.Editor.
Add values with methods such as putBoolean() and putString().
Commit the new values with commit()
To read values, use SharedPreferences methods such as getBoolean() and 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);
}