我是Android开发的新手,我有一个关于多个开关按钮的问题,如何聪明地检索值,并使这些数据可用于其他活动?
目前,我实现了按钮状态的保存和在当前活动中找到的信息的检索,具体如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
switchButtonOne = findViewById(R.id.switchButtonOne);
switchButtonOne.setChecked(true);
switchButtonTwo = findViewById(R.id.switchButtonTwo);
switchButtonTwo.setChecked(false);
//...... (In total there are 5 switch buttons)
//switchButtonOne
switchButtonOne.setOnCheckedChangeListener((compoundButton, isChecked) -> {
if(isChecked){
stringArrayList.add("1");
}else {
stringArrayList.remove("1");
}
getArray(stringArrayList);
//SAVE
sharedPreferences[0] = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = sharedPreferences[0].edit();
editor.putBoolean("1", switchButtonOne.isChecked());
editor.commit();
});
switchButtonOne.setChecked(sharedPreferences[0].getBoolean("1", false));
//switchButtonTwo
switchButtonTwo.setOnCheckedChangeListener((compoundButton, isChecked) -> {
if(isChecked){
stringArrayList.add("2");
}else {
stringArrayList.remove("2");
}
getArray(stringArrayList);
//SAVE
sharedPreferences[0] = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = sharedPreferences[0].edit();
editor.putBoolean("2", switchButtonTwo.isChecked());
editor.commit();
});
//.......
}
我相信有一种更有效的方法来实现这一点,我很高兴获得有效的资源来学习在活动之间提供信息和活动状态的最佳实践。
提前大谢
发布于 2018-01-23 21:54:12
一种选择是对所有五个按钮只使用一个侦听器。你会这样做的:
public class MyActivity extends Activity implements CompoundButton.OnCheckedChangeListener {
Switch[] buttons;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
buttons = new Switch[5];
Switch switchButtonOne = findViewById(R.id.switchButtonOne);
switchButtonOne.setOnCheckedChangeListener(this);
switchButtonOne.setChecked(sharedPreferences[0].getBoolean("1", false));
buttons[0] = switchButtonOne;
Switch switchButtonTwo = findViewById(R.id.switchButtonTwo);
switchButtonTwo.setOnCheckedChangeListener(this);
switchButtonTwo.setChecked(sharedPreferences[1].getBoolean("2", false));
buttons[1] = switchButtonTwo;
//...... (In total there are 5 switch buttons)
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int index;
switch (buttonView.getId()) {
case R.id.switchButtonOne:
index = 0;
break;
case R.id.switchButtonTwo:
index = 1;
break;
...
}
if (isChecked) {
stringArrayList.add(String.valueOf(index + 1));
} else {
stringArrayList.remove(String.valueOf(index + 1));
}
getArray(stringArrayList);
//SAVE
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = sharedPreferences[index].edit();
editor.putBoolean(String.valueOf(index + 1), buttons[index].isChecked());
editor.commit();
}
}
此时,代码并不比您的短得多,但是,一旦添加了其他三个按钮,您就会看到所有按钮的代码都要短得多,而且更简洁。
如果有一个用于BooleanArray
的SharedPreferences
,那就太好了,但是这样的类并不存在。一个解决方法可以找到here。
编辑
再看看你的问题和完整的代码,我会提出一个不同的方法。您根本不需要任何OnCheckedChangeListener
。只需在活动离开时保存按钮的状态(onPause
),并在活动恢复后恢复状态(onResume
)。一个副作用是代码变得更短了。
public class MainActivity extends Activity {
Switch[] buttons;
int numberOfButtons = 5;
SharedPreferences sharedPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
buttons = new Switch[numberOfButtons];
sharedPreferences = getSharedPreferences("YourPreferenceName", MODE_PRIVATE);
for (int i = 0; i < numberOfButtons; i++) {
buttons[i] = findViewById(getResources().getIdentifier("switchButton" + String.valueOf(i + 1), "id", getPackageName()));
}
}
public void onPause() {
super.onPause();
for (int i = 0; i < numberOfButtons; i++) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean(String.valueOf(i + 1), buttons[i].isChecked());
editor.apply();
}
}
public void onResume(){
super.onResume();
for (int i = 0; i < numberOfButtons; i++) {
buttons[i].setChecked(sharedPreferences.getBoolean(String.valueOf(i + 1), false));
}
}
}
请注意,在布局xml中,必须将开关的in更改为以下内容:switchButton1
、.、switchButton5
。
https://stackoverflow.com/questions/48403312
复制相似问题