【问题标题】:Where check if CheckBox that is added dynamically is checked? (Android)在哪里检查是否检查了动态添加的 CheckBox? (安卓)
【发布时间】:2017-05-20 10:50:02
【问题描述】:

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

(目前我正在尝试使按钮 invisible 正如您在上面看到的那样,因为我不想在布局文件中“硬编码”它们应该是不可见的- 认为这可能会导致无法改变?但那是后来的问题......)

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

【问题讨论】:

    标签: android checkbox visibility dynamically-generated ischecked


    【解决方案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 个复选框。

    希望这会有所帮助。

    【讨论】:

    • 我不确定,但也许你更早地理解了我的问题。该解决方案为我提供了一个有效的检查解决方案,对于我没有在启动时动态创建的复选框(我认为我的解决方案更早地工作,但它没有)。但是将这段代码放在哪里,以便在我想要检查它们时实际创建复选框?
    • 好的,正如我在我的问题中添加的那样,它现在可以使它们在 onCreate() 中可见。谢谢!我真的很想让它们在所有复选框都未选中时不可见,但这可能是另一个问题。
    • 看来您有两个问题需要解决。 1 是在活动循环时存储/恢复 onPause() onResume 中动态添加的复选框的状态。并且 2 你需要作为一个组来聆听这些复选框的变化。对吗?
    • @Ingrid 根据您的评论,请查看我的更新答案。
    【解决方案2】:
        //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);
    

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

    【讨论】:

      【解决方案3】:

      您可以看到选中 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) {
      
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 2021-11-23
        • 2017-04-13
        相关资源
        最近更新 更多