0

私は Web (SO を含む) を調べていて、永続的なデータを持つことに関する多くの情報を見つけました。文字列、int、double、カレンダーなど、ほぼすべてのものを見つけました。特定のガイドやチュートリアルを見ていないのはブール値です。

メイン アクティビティにスイッチがあるアプリを作成しました。メイン アクティビティからアプリ全体にアクセスするため、設定ボタン、ウィンドウ、さらにはペインさえありません。スイッチを保持するだけでなく、スイッチを永続的にしたいです(つまり、アプリを閉じると、ユーザーがバイブレーション機能を無効または有効にしたかどうかが記憶されます)。

スイッチの位置に応じて振動を有効にするスイッチがあります。アプリが再作成されたときに、スイッチをオフの位置に保つことができないようです。

保存するコードは次のとおりです。

@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 に保存されている場合、スイッチはオフの位置でロードされます)。2人のコミュニケーションの仕方がわかりません。スイッチは、その逆ではなく、ブール値に基づいて変更する必要があると思います。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 の使用方法がよくわかりません。また、それらを配置する場所を指定する場所が見つかりませんでした。明らかな理由から、ここではコメントアウトされています。ここからどこへ行くべきかわからない。

ありがとう!

ネイサン

編集:

次のコードを使用してみました:

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