2017-04-19 1 views
0

Ich versuche, den Zustand meines Switch zu speichern. Ich habe andere Antworten auf stackoverflow überprüft, habe es aber noch nicht herausgefunden.Speichern Switch-Status mit Einstellungen, boolean nicht speichern

Ich habe für meine Haupttätigkeit eine Umschalttaste (tgbutton) und Schalter (simpleSwitch1). Die Vorliebe für die Umschalttaste funktioniert, aber der Schalter nicht. Ich bin mir nicht sicher, ob ich die Präferenz für den Switch-Button richtig speichere, aber für die meisten anderen Foren/Antworten, die sie getan haben.

Bitte raten,

public class MainActivity extends AppCompatActivity { 

Switch simpleSwitch1; 
boolean switchState2 = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // initiate view's 
    simpleSwitch1 = (Switch) findViewById(R.id.simpleSwitch1); 

    SharedPreferences sharedPrefs = getSharedPreferences("com.example.xyle", MODE_PRIVATE); 
    simpleSwitch1.setChecked(sharedPrefs.getBoolean("NameOfThingToSave",false)); 

    switchState2 = sharedPrefs.getBoolean("NameOfThingToSave", false); 

    final ToggleButton tgbutton; 
    tgbutton = (ToggleButton) findViewById(R.id.toggle); 

    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    tgbutton.setChecked(sharedPreferences.getBoolean("toggleButton", false)); //default is false 

    tgbutton.setOnClickListener(new ToggleButton.OnClickListener() { 
     public void onClick(View v) { 
      SharedPreferences sharedPreferences = PreferenceManager 
        .getDefaultSharedPreferences(getApplicationContext()); 
      SharedPreferences.Editor editor = sharedPreferences.edit(); 
      editor.putBoolean("toggleButton", tgbutton.isChecked()); 
      editor.commit(); 
     } 
    }); 

    simpleSwitch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked){ 
       SharedPreferences.Editor editor = getSharedPreferences("com.example.xyz", MODE_PRIVATE).edit(); 
       editor.putBoolean("NameOfThingToSave", true); 
       editor.commit(); 
       Toast.makeText(MainActivity.this, "This is on " + switchState2, Toast.LENGTH_SHORT).show(); 
      } else { 
       SharedPreferences.Editor editor = getSharedPreferences("com.example.xyz", MODE_PRIVATE).edit(); 
       editor.putBoolean("NameOfThingToSave", false); 
       editor.commit(); 
       Toast.makeText(MainActivity.this, "This is off " + switchState2, Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 

} 

}

+0

Warum nicht zuerst überprüfen, ob onCheckedChanged überhaupt genannt wird, nächste Prüfung, wenn der Boolesche Wert gespeichert wird, und schließlich prüfen, ob der Wert ordnungsgemäß wiederhergestellt werden. – Merlevede

+0

Hey @Merlevede die onCheckedChanged funktioniert, es richtig Toast, wenn ich den Zustand von wahr zu falsch ändern. Mit der Überprüfung, ob der boolesche Wert gespeichert wird, tocaste ich auch den "switchState2" -Wert, der die gespeicherte Präferenz für den Schalterstatus sein sollte, der bei false bleibt, was zeigt, dass er entweder nicht richtig speichert oder wenn switchState2 nicht ist richtig initialisiert. – ojboba

+0

Ihr Toast ist falsch, weil es immer das ursprüngliche switchState2 zeigt, nicht die Präferenz. Es sollte sein: 'Toast.makeText (MainActivity.this," Dies ist: "+ sharedPrefs.getBoolean (" NameOfThingToSave ", false), Toast.LENGTH_SHORT) .show();' – Merlevede

Antwort

1

erklären Sie neue SharedPreferences jedes Mal, wenn Sie speichern/Wert abrufen, die nicht notwendig ist. Verwenden Sie einfach einen SharedPreferences und verfolgen Sie verschiedene Werte mit verschiedenen Schlüsseln. Und Sie sollten Ihre Werte in onStop() speichern, denn das macht mehr Sinn. Versuchen Sie den folgenden Code:

public class MainActivity extends AppCompatActivity { 

Switch simpleSwitch1; 
boolean switchState2 = false; 
SharedPreferences sharedPrefs; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // initiate view's 
    simpleSwitch1 = (Switch) findViewById(R.id.simpleSwitch1); 

    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    if(sharedPrefs.contains("NameOfThingToSave")){ 
     simpleSwitch1.setChecked(sharedPrefs.getBoolean("NameOfThingToSave",false)); 
     switchState2 = sharedPrefs.getBoolean("NameOfThingToSave", false); 
    } 

    final ToggleButton tgbutton; 
    tgbutton = (ToggleButton) findViewById(R.id.toggle); 

    if(sharedPrefs.contains("toggleVutton")){ 
     tgbutton.setChecked(sharedPrefs.getBoolean("toggleButton", false)); //default is false 
    } 

    tgbutton.setOnClickListener(new ToggleButton.OnClickListener() { 
     public void onClick(View v) { 

     } 
    }); 

    simpleSwitch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

     } 
    }); 

} 

    @Override 
    public void onStop() { 
      // Store toggle state 
      sharedPrefs.edit().putBoolean("toggleButton", tgbutton.isChecked()).commit(); 

     // Store switch state 
     if (simpleSwitch1.isChecked){ 
       sharedPrefs.edit().putBoolean("NameOfThingToSave", true).commit(); 
       Toast.makeText(MainActivity.this, "This is on " + switchState2, Toast.LENGTH_SHORT).show(); 
      } else { 
       sharedPrefs.edit().putBoolean("NameOfThingToSave", false).commit(); 
       Toast.makeText(MainActivity.this, "This is off " + switchState2, Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

Hoffe, dass dies hilft.

0
  1. Das Problem ist, Sie different Einstellungen verwenden ("com.example.xyle" und "com.example.xyz") zu speichern und boolean Wert.

  2. Der Wert von switchState2 nicht überall in Ihrem Code geändert, deshalb auf Ihrer Toast Nachricht gleiches Ergebnis seines immer zeigt.

Try this:

public class MainActivity extends AppCompatActivity { 

Switch simpleSwitch1; 
boolean switchState2 = false; 

SharedPreferences sharedPrefs; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // initiate view's 
    simpleSwitch1 = (Switch) findViewById(R.id.simpleSwitch1); 

    sharedPrefs = getSharedPreferences("com.example.xyz", MODE_PRIVATE); 
    simpleSwitch1.setChecked(sharedPrefs.getBoolean("NameOfThingToSave",false)); 

    switchState2 = sharedPrefs.getBoolean("NameOfThingToSave", false); 

    final ToggleButton tgbutton = (ToggleButton) findViewById(R.id.toggle); 
    tgbutton.setChecked(sharedPrefs.getBoolean("toggleButton", false)); //default is false 

    tgbutton.setOnClickListener(new ToggleButton.OnClickListener() { 
     public void onClick(View v) { 
      SharedPreferences.Editor editor = sharedPrefs.edit(); 
      editor.putBoolean("toggleButton", tgbutton.isChecked()); 
      editor.commit(); 
     } 
    }); 

    simpleSwitch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked){ 
       SharedPreferences.Editor editor = sharedPrefs.edit(); 
       editor.putBoolean("NameOfThingToSave", true); 
       editor.commit(); 

       switchState2 = true; 
       Toast.makeText(MainActivity.this, "This is on " + switchState2, Toast.LENGTH_SHORT).show(); 
      } else { 
       SharedPreferences.Editor editor = getSharedPreferences("com.example.xyz", MODE_PRIVATE).edit(); 
       editor.putBoolean("NameOfThingToSave", false); 
       editor.commit(); 

       switchState2 = false; 
       Toast.makeText(MainActivity.this, "This is off " + switchState2, Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 

} 
Verwandte Themen