2017-04-19 33 views
0

我试图保存我的交换机的状态。我已经在stackoverflow上检查了其他答案,但仍然没有弄清楚。使用偏好设置保存切换状态,布尔值不保存

我的主要活动有一个切换按钮(tgbutton)和开关(simpleSwitch1)。切换按钮的首选项工作,但切换不。不知道我是否正确保存了开关按钮的偏好设置,但是对于大多数其他论坛/他们所做的答案。

请指教,

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

你为什么不先检查是否onCheckedChanged被称为可言,如果布尔值被保存下次检查,最后检查值正确恢复。 – Merlevede

+0

嘿@Merlevede onCheckedChanged的作品,它正确的吐司,如果我改变状态从真到假。检查布尔值是否正在保存,我也烘烤了“switchState2”值,它应该是存储在开关状态的首选项,它保持为false,表明它没有正确保存,或者如果switchState2没有被保存正确初始化。 – ojboba

+0

你的Toast是错误的,因为它总是显示原始的switchState2,而不是偏好。它应该是: 'Toast.makeText(MainActivity.this,“This is:”+ sharedPrefs.getBoolean(“NameOfThingToSave”,false),Toast.LENGTH_SHORT).show();' – Merlevede

回答

1

您正在申报新SharedPreferences每次存储/检索时间值是不必要的。只需使用一个SharedPreferences并使用不同的键跟踪不同的值。你应该在onStop()中存储你的值,因为这更有意义。尝试下面的代码:

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(); 
      } 
     } 
    } 

希望这有助于。

0
  1. 的问题是,你正在使用different偏好("com.example.xyle""com.example.xyz")来存储和获取boolean值。

  2. switchState2的值在您的代码中没有任何变化,这就是为什么您的Toast消息始终显示相同的结果。

试试这个:

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(); 
      } 
     } 
    }); 

}