检查是否检查了动态添加的CheckBox? (机器人)

时间:2017-01-05 19:04:35

标签: android checkbox visibility dynamically-generated ischecked

我已在onCreate()方法中动态添加了复选框。当检查其中一个或多个时,我想要显示两个按钮。我不熟悉使用Android,但是我可以告诉它,在添加复选框的方法(即onCreate())中执行此检查(请参阅是否选中​​复选框)是行不通的,因为它们可以找不到,即尚未创建?如果是这种情况,我应该以什么方法进行检查?我想在活动启动时添加复选框,并检查是否一直检查这些复选框。

复选框已添加到displayEntries(db)

这是我的onCreate():

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DatabaseHandler db = new DatabaseHandler(this);
        displayEntries(db);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(MainActivity.this, AddActivity.class); //FromActivity.this
                startActivity(i);
            }
        });

        checkChecked();
    }

checkChecked():

public void checkChecked() {
        //Check whether items have been checked
        TableLayout tl = (TableLayout) findViewById(R.id.entry_table);
        for (int i = 0; i < tl.getChildCount(); i++) {
            View child = tl.getChildAt(i);
            if (child instanceof CheckBox) {
                CheckBox checkBoxChild = (CheckBox) child;
                Log.d("Checkbox", "Checkbox is found");
                if (checkBoxChild.isChecked()) {
                    Log.d("Checkbox", "working!");
                    Button button1 = (Button) findViewById(R.id.button_edit);
                    button1.setVisibility(View.INVISIBLE);
                    Button button2 = (Button) findViewById(R.id.button_delete);
                    button2.setVisibility(View.INVISIBLE);
                }
            }
        }
    }

(目前我正在努力使按钮不可见如上所示,因为我不想在布局文件中“硬编码”它们应该是不可见的开始 - 认为这可能使其无法改变?但那是后来的问题......)

编辑:我意识到我的错误是认为我的TableLayout的子项的复选框。它们实际上是TableLayout中行的子项。现在我设法找到了实际的复选框,我可以通过在创建按钮时将它们设置为不可见并且在onClick上可见来使按钮消失。剩下的问题是,即使再次取消选中所有按钮,按钮当然也会保持可见。有关如何根据是否选中任何复选框来打开和关闭按钮的任何想法?

3 个答案:

答案 0 :(得分:1)

一开始不明白你的问题。请忽略我的第一个答案。

如果您想要在复选框上收听,可能需要尝试

myCheckBox.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View view) {
        //do something
    }
});

您在onCreate()中执行的任何操作都将在每个活动周期中重新创建。 因此,您可能希望存储复选框的状态,并在有人点击它时更改该状态。

@Ingrid评论后编辑:

看起来有两个问题需要解决。一种是保存状态并在活动/片段循环中恢复它,另一种是根据N个复选框的条件设置按钮可见。

假设您正在使用数据库对象,您可以选择使用动态创建的复选框来操作数据库对象中的数据。复选框表示数据库对象或对象列表中的布尔值。由于复选框是动态的并且表示数据库中的内容,因此将它们的状态存储在两个位置没有多大意义。如果你这样做,事情会变得不同步,你会有一个讨厌的错误。而是依赖于DB对象。因此,单击复选框时更新数据库对象。在onResume()中检索该DB对象(来自bundle或DB,具体取决于您的体系结构),并根据DB对象的状态设置复选框/按钮状态。

您可以使用onPause()来持久保存db对象。或者点击复选框坚持下去,这样你就不必担心失去中间的状态。使用onResume根据db对象的当前状态设置UI组件。最后但同样重要的是,当您更新db对象时,请检查是否需要显示/隐藏按钮。 (即如果有固定数量的按钮,但有N个复选框。

希望这会有所帮助。

答案 1 :(得分:0)

    //Use shared preference to save.
SharedPreferences preferedName=getSharedPreferences("SavedName", Activity.MODE_PRIVATE);
                SharedPreferences.Editor editor = preferedName.edit();
                editor.putboolean("SavedName",value);
                editor.apply();
                editor.commit();
//and to retrive.
SharedPreferences preferedName=getSharedPreferences("SavedName", Activity.MODE_PRIVATE);
        boolean chkNull =preferedName.getString("SavedName",false);

并使用布尔值作为复选框的值。

答案 2 :(得分:-1)

你可以看到检查CompoundButton,因为CheckBox继承自CompoundButton

https://developer.android.com/reference/android/widget/CompoundButton.html#setOnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener)

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

            }
        });