I have a layout in which there are spinners, editText and checkboxes. There two modes:
1- edit all views (edit mode)
2- view (non edit mode)
But I don't want to do it for each view . Is there any way to set editable
true or false?
I have a layout in which there are spinners, editText and checkboxes. There two modes:
1- edit all views (edit mode)
2- view (non edit mode)
But I don't want to do it for each view . Is there any way to set editable
true or false?
in edit mode use this in every view
yourView.setEnabled(true);
in read mode use this
yourView.setEnabled(false);
The simple way is to create a set of such views manually:
val editableViews: Set<View> = setOf(v1, v2, v3)
and use it:
editableViews.forEach { it.enabled = isEditMode }
If you have a complex layout you may add dynamic initialization:
private fun getAllViews(
view: View,
set: MutableSet<View>,
filter: (view: View) -> Boolean = {true}
){
val viewGroup = view as? ViewGroup
if (viewGroup != null) {
for (i: Int in 0 until viewGroup.childCount) {
val child = viewGroup.getChildAt(i)
getAllViews(child, set)
}
} else {
if (filter()) {
set.add(view)
}
}
}
initialize it in onViewCreated
or in onCreate
val views = mutableSetOf<View>()
getAllViews(root, views) {
it is Spinner || it is EditText || it is Checkbox
}
editableViews = views
It collects all required views, so you may make them enabled or disabled. But you should note, that this variant is not so flexible and you should prefer just the first one. (In case any exception you have to exclude some)
This method will enable/disable all widgets of your parent layout.
public void enableAllView(ViewGroup rootView, boolean state) {
for (int i = 0; i < rootView.getChildCount(); i++) {
View childAt = rootView.getChildAt(i);
if (childAt instanceof ViewGroup ) {
enableAllView((ViewGroup) childAt, state);
} else {
if (childAt instanceof EditText) {
EditText child = (EditText) childAt;
child.setEnabled(state);
child.setFocusable(state);
} else if (childAt instanceof Spinner) {
Spinner child = (Spinner) childAt;
child.setEnabled(state);
child.setFocusable(state);
} else if (childAt instanceof CheckBox) {
CheckBox child = (CheckBox) childAt;
child.setEnabled(state);
child.setFocusable(state);
}
}
}
}
call this method like this--
enableAllView(rootView, true); // in case of edit(enable)
enableAllView(rootView, false); // in case of view(disable)
//rootView is a view in which your spinners/editText/checkbox are availabe.