我已在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上可见来使按钮消失。剩下的问题是,即使再次取消选中所有按钮,按钮当然也会保持可见。有关如何根据是否选中任何复选框来打开和关闭按钮的任何想法?答案 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
checkBoxChild.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}
});