首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多开关按钮

多开关按钮
EN

Stack Overflow用户
提问于 2018-01-23 13:48:31
回答 1查看 1.9K关注 0票数 0

我是Android开发的新手,我有一个关于多个开关按钮的问题,如何聪明地检索值​​,并使这些数据可用于其他活动?

目前,我实现了按钮状态的保存和在当前活动中找到的信息的检索,具体如下:

代码语言:javascript
运行
复制
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();
    });
    //.......
}

我相信有一种更有效的方法来实现这一点,我很高兴获得有效的资源来学习在活动之间提供信息和活动状态的最佳实践。

提前大谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-23 21:54:12

一种选择是对所有五个按钮只使用一个侦听器。你会这样做的:

代码语言:javascript
运行
复制
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();
    }
}

此时,代码并不比您的短得多,但是,一旦添加了其他三个按钮,您就会看到所有按钮的代码都要短得多,而且更简洁。

如果有一个用于BooleanArraySharedPreferences,那就太好了,但是这样的类并不存在。一个解决方法可以找到here

编辑

再看看你的问题和完整的代码,我会提出一个不同的方法。您根本不需要任何OnCheckedChangeListener。只需在活动离开时保存按钮的状态(onPause),并在活动恢复后恢复状态(onResume)。一个副作用是代码变得更短了。

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48403312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档