【问题标题】:how to pass checkbox data to another activity如何将复选框数据传递给另一个活动
【发布时间】:2020-07-18 21:33:36
【问题描述】:

如何将复选框数据从一个活动传递到另一个活动?如果复选框被选中/选中,它将以字符串的形式将数据从第一个活动传递到第二个活动。第二个活动将获取字符串并在_Job_fx上设置文本,但是为什么在未选中复选框时会出现其他复选框字符串?我的数据绕过了我的条件并在 _Job_fx 上设置了文本。如何解决这个问题?

第一个活动:

sharedPreferences = getSharedPreferences("Add_job_fx", MODE_PRIVATE);

_electric_item01 = (CheckBox) findViewById(R.id.electric_item01);
checkbox(_electric_item01);
_electric_item02 = (CheckBox) findViewById(R.id.electric_item02);
checkbox(_electric_item02);
_electric_item03 = (CheckBox) findViewById(R.id.electric_item03);
checkbox(_electric_item03);
_electric_item04 = (CheckBox) findViewById(R.id.electric_item04);
checkbox(_electric_item04);

    private void checkbox(final CheckBox check) {

        check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (check.isSelected()) {
                    //edit shared preference (put data)
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    //put data in shared preference
                    editor.putString(check.getText().toString(), check.getText().toString());
                    //apply changes to shared preference
                    editor.apply();
                }
                else {
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.remove(check.getText().toString());
                    editor.clear();
                    editor.apply();
                }
            }
        });
    }

第二个活动:

//shared preferences (Name, Mode)
sharedPreferences = getSharedPreferences("Add_job_fx", MODE_PRIVATE);
//get data from shared preference
s_electric_item01 = sharedPreferences.getString("Change lightbulb", "");
s_electric_item02 = sharedPreferences.getString("Change starter", "");
s_electric_item03 = sharedPreferences.getString("Change light set", "");
s_electric_item04 = sharedPreferences.getString("Change fan + regulator", "");
//pass data to container for view 
_Job_fx.setText("Job: " + s_electric_item01 +"\n"+ s_electric_item02 + "\n"+ s_electric_item03);

【问题讨论】:

  • 您确定需要将remove() 和clear() 组合在一起吗?
  • 此外,我现在正在查看文档,如果在使用 putString() 或任何其他“放置”时调用 apply() 是可以的,那么在使用 remove() 和 clear() 时只说将它与commit() 结合起来。 remove() docsclear() docs
  • 哦,我生气了,设置了 2 个限制来从 sharedpreference 中删除数据。它不起作用...我不知道是什么导致我的第一个活动绕过我的 if 语句并将数据传递给第二个活动,即使我的复选框没有被选中。
  • 我是这么认为的,但是您是否尝试过使用commit() 而不是apply()?仅用于删除数据。
  • 您在谈论传递数据,但它只是复选框的真或假。我想知道为什么您将状态保存在共享首选项中,您可以在启动第二个活动的意图中使用 putExtra()。此外,如果您想保留共享偏好并且删除不起作用,您可以将“true”更改为“false”。

标签: android checkbox android-checkbox


【解决方案1】:

我想你需要先检查复选框是否被选中,如果选中 返回 true ,并相应地获取您的复选框值并将其用于 共享偏好

 private void checkbox(final CheckBox check) {

          SharedPreferences sharedPreferences = 
        getSharedPreferences("Add_job_fx", MODE_PRIVATE); //add this line here 
        check.setOnCheckedChangeListener(new 
             CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean 
                isChecked) {
                if (isChecked) { // here check if the checkbox is checked 
                    // or not if yes then retreive the value and push it into 
                    // Sharedpreferences

                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString("put a key here ",
                            check.getText().toString());
                    editor.apply();
                }
                else {
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.remove("put your key to remove from SP , the same key 
                     as 
                            above");
                            editor.clear();
                    editor.apply();
                }
            }
            
        });

【讨论】:

  • 问题依然存在。代码和我的不一样吗?
  • 你的具体问题是什么,我没弄好
  • 由于某种原因,第一个活动 sharedpreference 绕过 if 语句并将字符串传递给第二个活动。所以即使我的复选框没有被选中/选中,第二个活动仍然会收到导致 Job_fx.setText("Job: " + s_electric_item01 +"\n"+ s_electric_item02 + "\n"+ s_electric_item03); 显示未选中复选框的字符串
  • 我猜你需要使用 OnCheckedChangeListener 而不是 clicklistener ,检查我的代码,我编辑了它
  • 我使用了你的代码,问题是一样的。没有任何变化。
【解决方案2】:

我已经解决了,关于 sharedpreferences 的事情是即使应用程序关闭它也会自动保存数据。所以默认情况下,每次我在第一次尝试后进入第二个活动时,它都会将之前的字符串保存到_Job_fx.setText。解决方法就是把之前的String去掉,默认为空。

sharedPreferences = getSharedPreferences("Add_job_fx", MODE_PRIVATE);

_electric_item01 = (CheckBox) findViewById(R.id.electric_item01);
checkbox(_electric_item01);
_electric_item02 = (CheckBox) findViewById(R.id.electric_item02);
checkbox(_electric_item02);
_electric_item03 = (CheckBox) findViewById(R.id.electric_item03);
checkbox(_electric_item03);
_electric_item04 = (CheckBox) findViewById(R.id.electric_item04);
checkbox(_electric_item04);

private void checkbox(final CheckBox check) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.remove(check.getText().toString());
        editor.apply();
        check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (check.isChecked()) {
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString(check.getText().toString(), check.getText().toString());
                    editor.apply();
                } else if (!check.isChecked()) {
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.remove(check.getText().toString());
                    editor.apply();
                }
            }
        });
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多