0

我一直在浏览网络(包括 SO),并找到了很多关于拥有持久数据的信息。我找到了字符串、整数、双打、日历,几乎所有东西。我没有看到具体指南或教程的那些是布尔值。

我创建了一个应用程序,它的开关位于主要活动上。我没有设置按钮、窗口甚至窗格,因为整个应用程序都是从主 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 编辑布尔值.

我尝试了几种不同的方法来使这些数据持久化,但它们都不适合我。如果我能在持久数据方面获得一些帮助,特别是关于布尔值,那就太好了。

编辑:显示我尝试使用 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 相互通信。

4

1 回答 1

0

您可以使用SharedPreferences来存储原始值。

执行此操作的最佳位置是在值更改之后。

因此,将保存添加到您的开关侦听器的逻辑中,并将加载添加到您的开关初始化程序的逻辑中。

要为您的应用程序获取 SharedPreferences 对象,请使用以下两种方法之一:

getSharedPreferences() - 如果您需要多个按名称标识的首选项文件,请使用此选项,您可以使用第一个参数指定该名称。

getPreferences() - 如果您的 Activity 只需要一个首选项文件,请使用此选项。因为这将是您的活动的唯一首选项文件,所以您不提供名称。

要写入值:

调用 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);
}
于 2015-04-11T15:15:43.140 回答