Где проверить, проверен ли добавленный CheckBox динамически? (Android)
Я добавил флажки динамически в моем 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. Теперь, когда мне удалось найти фактический флажок, я могу сделать так, чтобы кнопки исчезали, устанавливая их как невидимые при их создании и видимые на клике. Оставшаяся проблема заключается в том, что кнопки, конечно, остаются видимыми, даже если все кнопки снова не отмечены. Любые идеи о том, как включать и выключать кнопки в зависимости от того, установлены ли какие-либо флажки или нет?
3 ответа
Сначала не поняла ваш вопрос. Пожалуйста, проигнорируйте мой первый ответ.
Если вы хотите прослушать флажок, вы можете попробовать
myCheckBox.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
//do something
}
});
Все, что вы делаете в onCreate(), будет воссоздано с каждым циклом активности. Поэтому вы можете захотеть сохранить состояние флажка и изменить его, когда кто-то нажимает на него.
РЕДАКТИРОВАТЬ после @Ingrid комментария:
Похоже, есть две проблемы, которые необходимо решить. Один сохраняет состояние и восстанавливает его в цикле активности / фрагмента, другой - устанавливает видимые кнопки в зависимости от состояния N флажков.
Предполагая, что вы работаете с объектом базы данных, у вас есть возможность использовать динамически создаваемые флажки для манипулирования данными в вашем объекте базы данных. Флажки представляют логические значения в вашем объекте БД или списке объектов. Поскольку флажки являются динамическими и представляют вещи в вашей БД, нет смысла хранить их состояние в двух местах. Если вы сделаете это, все будет синхронизировано, и у вас будет неприятная ошибка. Скорее полагайтесь на объект БД. Таким образом, обновите свой объект БД, когда вы нажимаете на флажок. В onResume() извлеките этот объект БД (из комплекта или БД в зависимости от вашей архитектуры) и установите флажки / состояние кнопок на основе состояния объекта БД.
Вы можете использовать onPause(), чтобы сохранить ваш объект БД. или сохраните его, нажав на флажок, чтобы вам не пришлось опасаться потери промежуточного состояния. используйте onResume для настройки базы компонентов вашего пользовательского интерфейса на текущее состояние объекта db. Последнее, но не менее важное, когда вы обновляете свой объект db, проверьте, нужно ли вам показывать / скрывать кнопки. (То есть, если есть фиксированное количество кнопок, но N количество флажков.
Надеюсь это поможет.
//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);
и используйте логическое значение в качестве значения флажка.
Вы можете увидеть проверку CompoundButton, потому что CheckBox наследуется от CompoundButton
https://developer.android.com/reference/android/widget/CompoundButton.html
checkBoxChild.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}
});