1

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

检查检查():

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 中行的子代。现在我设法找到了实际的复选框,我可以通过在创建按钮时将它们设置为不可见并在单击时显示按钮来使它们消失。剩下的问题是,即使再次取消选中所有按钮,按钮当然也会保持可见。关于如何根据是否选中任何复选框来打开和关闭按钮的任何想法?

4

3 回答 3

1

一开始没看懂你的问题。请忽略我的第一个答案。

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

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

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

在@Ingrid 评论后编辑:

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

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

您可以使用 onPause() 来持久化您的 db 对象。或在单击复选框时将其保留,这样您就不必担心丢失中间的状态。使用 onResume 根据 db 对象的当前状态设置您的 UI 组件。最后但并非最不重要的一点是,当您更新 db 对象时,请检查是否需要显示/隐藏按钮。(也就是说,如果有固定数量的按钮,但有 N 个复选框。

希望这可以帮助。

于 2017-01-05T19:11:50.020 回答
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);

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

于 2017-01-05T19:30:31.527 回答
-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) {

            }
        });
于 2017-01-05T19:34:46.957 回答