android finding checkboxes in a linear layout - android

i have several checkboxes added programmatically in a LinearLayout. is it possible to find and check all CheckBoxes in a LinearLayout?
my xml structure is as follows:
<LinearLayout>
<ScrollView>
<TableLayout>
<TableRow>
<CheckBox>
</TableRow>
<TableRow>
<CheckBox>
</TableRow>
</TableLayout>
</ScrollView>
</LinearLayout>
Java Code:
CheckBox selectAll = (CheckBox)findViewById(R.id.checkboxSelectAll);
selectAll.setOnCheckedChangeListener(new OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(buttonView.isChecked()){
//loop in linear layout
//find each checkbox
//setChecked(true);
}
}
});

You can either hold a reference for the checkboxes or you can loop thru all elements using getChildCount() and then getChildAt and then check if the element is type of (instanceof) CheckBox and if it is just cast it to CheckBox and set it checked to true.
LinearLayout yourLayout= (LinearLayout) view.findViewById(R.id.linearLayout);
int count = yourLayout.getChildCount();
for (int i = 0; i < count; i++) {
View v = rootLinearLayout.getChildAt(i);
if (v instanceof CheckBox) {
((CheckBox) v).setChecked(true);
}
}
I hope that helps

If CheckBoxes are added programmatically, you can hold references to them in member variable of your Activity class.

Related

How to group radio buttons programmatically in Java/Kotlin?

I have a custom view for radio buttons in the XML layout file with ConstraintLayout. I need to group those radio buttons. But when I try to envelop that ConstraintLayout with the Radio group, it does not group the buttons and all options are getting selected.
RadioButtons need to be the direct children of a RadioGroup in order for the grouping functionality to work. A RadioGroup is just a special LinearLayout that implements the grouping functionality for all the children added that are RadioButtons. You can simply implement your own grouping functionality by adding the RadioButtons to a List and then implementing OnCheckedChangeListener and setting it on each of the RadioButtons as follows:
private final List<RadioButton> radioButtons = new ArrayList<>();
private int checkedId;
private void setRadioButton(RadioButton radioButton) {
radioButtons.add(radioButton);
radioButton.setOnCheckedChangeListener(mOnCheckedChangeListener);
}
private final CompoundButton.OnCheckedChangeListener mOnCheckedChangeListener =
new CompoundButton.OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
checkedId = buttonView.getId();
}
for (RadioButton radioButton : radioButtons) {
if (radioButton.getId() != checkedId) {
radioButton.setChecked(false);
}
}
}
};
you can set false the checked of icon in the defult running like this code in layout
xml
android:checked="false"
and in coding you can call binding.rdiobutton.setonclicklistenert{
binding.btnclick.setonclicklistener)
Use the following code in kotlin
radioGroup.check(id)
First, you write the name of the radio group, then instead of the ID, put the ID of the radio button,
For example, it is like this in my project
rg_licenseType.check(R.id.rb_three)

Inserting n elements from xml layout to LinkedList (Android)

I have n CheckBox elements in my XML layout for a user registration page. My XML is as follows:
<CheckBox
android:id="#+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Option 1"/>
<CheckBox
android:id="#+id/checkBox2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Option 2" />
How can I add those elements to a LinkedList of type CheckBox in my java code? Ideally, I'd like to use a for-loop to find all elements containing ID "checkbox."
Thanks for any assistance.
You could traverse through the parent view (let's say it's called resultView).
List<CheckBox> boxes = new ArrayList<>();
for (int i = 0; i < resultView.getChildCount(); i++) {
if (resultView.getChildAt(i) instanceof CheckBox) {
// this is a check box for sure
boxes.add((CheckBox) resultView.getChildAt(i));
}
if (resultView.getChildAt(i).toString().contains("checkbox")) {
// this might be a checkbox, and may cause ClassCastException
boxes.add((CheckBox) resultView.getChildAt(i));
}
}
If your CheckBoxes are in the same parent view, you can try to loop for it's children like :
List<CheckBox> list = new LinkedList<>();
RelativeLayout layout = (RelativeLayout)findViewById(R.id.layout);
for (int i = 0; i < layout.getChildCount(); i++) {
View child = layout.getChildAt(i);
//Some condition to get the view you want
//and make sure it's a CheckBox (maybe by tag?)
list.add((CheckBox)child);
}

Maintaining the CheckBox Behaviour

I am having a select all checkbox button in my layout and a list view each with a check box in the right. I have added following code for the select all checkbox as :
selectall.setOnCheckChangedListener code :-
for(int i=0; i < listView.getChildCount(); i++){
RelativeLayout itemLayout = (RelativeLayout)listView.getChildAt(i);
CheckBox cb = (CheckBox)itemLayout.findViewById(R.id.MyListViewCheckBox);
cb.setChecked(true);
}
Here I am maintaining each list view item
holder.mcbGoupMember.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
commonFriends.get(position).setChecked(isChecked);
}
});
Now here I am stuck in a situation, I want that when I manually select all the checkbox items, then at that instant the select all button/checkbox should automatically be checked on and vice versa.
How can I achieve this??
Refer this sample program for listview checkbox scroll issue
You could just keep a simple count of the number of items you have checked at a time. If you check an item increase it by one, if you uncheck an item decrease it by one. After each increase/decrease check if this checked items number is equal to number of items on your list and check the select all if it is. Just make sure that your selectall.setOnCheckChangedListener sets the list checkbox values to whatever value it receives in isChecked. For example:
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
for(int i=0; i < listView.getChildCount(); i++){
RelativeLayout itemLayout = (RelativeLayout)listView.getChildAt(i);
CheckBox cb = (CheckBox)itemLayout.findViewById(R.id.MyListViewCheckBox);
cb.setChecked(isChecked);
}
}

Performing a Mark All for checkboxes in Android

I am working on an android project with many activities and classes.
In few of the Layouts, I have a facility in which a user can select mark all so that all the checkboxes get selected.
But, the issue I am facing is I know only the one way (which is too lengthy) to do this - By creating a markall layout for each of those existing layouts, pasting the original layout code in the markall layout code and then giving all checkboxes as checked.
This requires me to create xmls for all unmarkings also for each layout.
Please tell me a way in which I can create one xml for markall which has all checked checkboxes, and then call that layout on top of original layout when mark all is clicked.
Lets assume you have following Layout
<LinearLayout
android:id="#+id/checkbox_container"
...params>
<CheckBox ...params/>
<TextView ...params/>
<CheckBox ...params/>
<SomeView ...params/>
<CheckBox ...params/>
</LinearLayout>
get your checkBoxLayout like this inside Activity
LinearLayout container = (LinearLayout)findViewById(R.id.checkbox_container);
Iterate over the childs inside the container like this:
for (int i = 0; i < container.getChildCount(); i++){
View v = container.getChildAt(i);
if (v instanceof CheckBox){
CheckBox cb = (CheckBox)v;
// isChecked should be a boolean indicating if every Checkbox should be checked or not
cb.setChecked(isChecked)
}
}
CheckBox MarkAllCheckBox =
(CheckBox) findViewById( R.id.MarkAllCheckBox);
MarkAllCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if ( isChecked )
{
checkBox1.setChecked("true");
checkBox2.setChecked("true");
checkBox3.setChecked("true");
//so on
}
}
});

Make a Layout inactive in android

I have a RelativeLayout and in this RelativeLayout there are 4 Buttons. Outside this RelativeLayout there is CheckBox.The whole View is in a RelativeLayout.
I want to make the 4 Buttons to inactive (which are present in the RelativeLayout) by selecting on CheckBox and I want to make all the buttons active when I again select the CheckBox. so what to do ?
I have also tried relativeLayout.setClickable(false); but it is not working.
final int[] BUTTON_IDS = { R.id.button1, R.id.button2, };
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
for (int btnId = 0; btnId < BUTTON_IDS.length; btnId++) {
Button btn = (Button) findViewById(btnId);
btn.setEnabled(isChecked);
}
}
});
UTDATE
Try this:
<yourRelativeLayout>.setEnabled(false);
or you can change state of all your buttons to disabled.

Categories

Resources