Android app with several checkbox areas
My app is several checkboxes areas. On some event data from all checkboxes will be saved/sent/etc.
All is working, but this Activity is loading about 7 seconds because my code is bad, so I need help in refactoring and optimize it.
How it looks in the app:
I have 10 forms with ~ 100 checkboxes summary. To draw it, I'm using 10 recyclers with 10 adapters. Every adapter initialize with his own list and have own layout manager.
How can I make this code good?
I can't pass all code, it's too large, so I give it apart.
To draw one recycler I use it (variable names changed):
//toolbar and questform
...
<RelativeLayout android:id="@+id/rv_wrapper1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/padding_default">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:text="@string/title1"
android:textSize="@dimen/text_size_big" />
<ImageView
android:id="@+id/img_arrow_1"
android:layout_width="@dimen/image_size_small"
android:layout_height="@dimen/image_size_small"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/margin_default"
android:layout_marginRight="@dimen/margin_default"
android:src="@drawable/ic_expand" />
<com.github.chuross.library.ExpandableLayout
android:id="@+id/rv_expaner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/img_arrow_1"
app:exl_duration="1000">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/padding_small">
</android.support.v7.widget.RecyclerView>
</com.github.chuross.library.ExpandableLayout>
</RelativeLayout>
///another recycles
and I duplicate it 9 times on XML.
Activity
RecyclerView rv1 = findViewById(R.id.rv1);
RecyclerView rv2 = findViewById(R.id.rv2);
//another 8 RV.
...
rv1Adapter = new RVAdapter(this, initializList1(this));
rv2Adapter = new RVAdapter(this, initializList2(this));
//another 8 adapters
...
rv1.setAdapter(rv1Adapter);
rv2.setAdapter(rv2Adapter);
...
//another 8 setters
RecyclerView.LayoutManager layoutManagerForRv1 = new GridLayoutManager(this, 3);
RecyclerView.LayoutManager layoutManagerForRv2 = new GridLayoutManager(this, 3);
...
//another 8 managers
rv1.setLayoutManager(layoutManagerForRv1);
rv2.setLayoutManager(layoutManagerForRv2);
...
//another 8 setters for managers
RelativeLayout rv1Expander = findViewById(R.id.rv_expander1);
RelativeLayout rv2Expander = findViewById(R.id.rv_expander2);
...
//another 8 RL
rv1Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander1));
rv2Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander2));
...
//another 8 listeners
ExpanderLayoutHelper
- using for expand/collapse animation of RV:
public class ExpanderLayoutHelper implements View.OnClickListener {
RelativeLayout expandWrapper;
ImageView arrow;
ExpandableLayout expandableLayout;
ExpanderLayoutHelper(int relativeLayoutId) {
this.expandWrapper = findViewById(relativeLayoutId);
this.arrow = (ImageView) expandWrapper.getChildAt(1);
this.expandableLayout = (ExpandableLayout) expandWrapper.getChildAt(2);
}
@Override
public void onClick(View v) {
if (expandableLayout.isCollapsed()) {
expandableLayout.expand();
expandWrapper.getChildAt(1).animate().rotation(90f).setDuration(1000);
} else {
expandableLayout.collapse();
arrow.animate().rotation(0).setDuration(1000);
}
}
}
Other points will be here if i remember something important.
initializeList()
is just 1-20list.add("something")
operation. For every form I have unique lists, so I have 10 initialize methods now.When I draw 10 recyclers without adapters lists initialization, the app is not lagging. So, it lags about lines
adapter = new RVAdapter(this, initialize(this));
. I know I can try to solve it with multithread, but bad code and XML is not gone.
java performance android xml
add a comment |
My app is several checkboxes areas. On some event data from all checkboxes will be saved/sent/etc.
All is working, but this Activity is loading about 7 seconds because my code is bad, so I need help in refactoring and optimize it.
How it looks in the app:
I have 10 forms with ~ 100 checkboxes summary. To draw it, I'm using 10 recyclers with 10 adapters. Every adapter initialize with his own list and have own layout manager.
How can I make this code good?
I can't pass all code, it's too large, so I give it apart.
To draw one recycler I use it (variable names changed):
//toolbar and questform
...
<RelativeLayout android:id="@+id/rv_wrapper1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/padding_default">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:text="@string/title1"
android:textSize="@dimen/text_size_big" />
<ImageView
android:id="@+id/img_arrow_1"
android:layout_width="@dimen/image_size_small"
android:layout_height="@dimen/image_size_small"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/margin_default"
android:layout_marginRight="@dimen/margin_default"
android:src="@drawable/ic_expand" />
<com.github.chuross.library.ExpandableLayout
android:id="@+id/rv_expaner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/img_arrow_1"
app:exl_duration="1000">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/padding_small">
</android.support.v7.widget.RecyclerView>
</com.github.chuross.library.ExpandableLayout>
</RelativeLayout>
///another recycles
and I duplicate it 9 times on XML.
Activity
RecyclerView rv1 = findViewById(R.id.rv1);
RecyclerView rv2 = findViewById(R.id.rv2);
//another 8 RV.
...
rv1Adapter = new RVAdapter(this, initializList1(this));
rv2Adapter = new RVAdapter(this, initializList2(this));
//another 8 adapters
...
rv1.setAdapter(rv1Adapter);
rv2.setAdapter(rv2Adapter);
...
//another 8 setters
RecyclerView.LayoutManager layoutManagerForRv1 = new GridLayoutManager(this, 3);
RecyclerView.LayoutManager layoutManagerForRv2 = new GridLayoutManager(this, 3);
...
//another 8 managers
rv1.setLayoutManager(layoutManagerForRv1);
rv2.setLayoutManager(layoutManagerForRv2);
...
//another 8 setters for managers
RelativeLayout rv1Expander = findViewById(R.id.rv_expander1);
RelativeLayout rv2Expander = findViewById(R.id.rv_expander2);
...
//another 8 RL
rv1Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander1));
rv2Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander2));
...
//another 8 listeners
ExpanderLayoutHelper
- using for expand/collapse animation of RV:
public class ExpanderLayoutHelper implements View.OnClickListener {
RelativeLayout expandWrapper;
ImageView arrow;
ExpandableLayout expandableLayout;
ExpanderLayoutHelper(int relativeLayoutId) {
this.expandWrapper = findViewById(relativeLayoutId);
this.arrow = (ImageView) expandWrapper.getChildAt(1);
this.expandableLayout = (ExpandableLayout) expandWrapper.getChildAt(2);
}
@Override
public void onClick(View v) {
if (expandableLayout.isCollapsed()) {
expandableLayout.expand();
expandWrapper.getChildAt(1).animate().rotation(90f).setDuration(1000);
} else {
expandableLayout.collapse();
arrow.animate().rotation(0).setDuration(1000);
}
}
}
Other points will be here if i remember something important.
initializeList()
is just 1-20list.add("something")
operation. For every form I have unique lists, so I have 10 initialize methods now.When I draw 10 recyclers without adapters lists initialization, the app is not lagging. So, it lags about lines
adapter = new RVAdapter(this, initialize(this));
. I know I can try to solve it with multithread, but bad code and XML is not gone.
java performance android xml
add a comment |
My app is several checkboxes areas. On some event data from all checkboxes will be saved/sent/etc.
All is working, but this Activity is loading about 7 seconds because my code is bad, so I need help in refactoring and optimize it.
How it looks in the app:
I have 10 forms with ~ 100 checkboxes summary. To draw it, I'm using 10 recyclers with 10 adapters. Every adapter initialize with his own list and have own layout manager.
How can I make this code good?
I can't pass all code, it's too large, so I give it apart.
To draw one recycler I use it (variable names changed):
//toolbar and questform
...
<RelativeLayout android:id="@+id/rv_wrapper1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/padding_default">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:text="@string/title1"
android:textSize="@dimen/text_size_big" />
<ImageView
android:id="@+id/img_arrow_1"
android:layout_width="@dimen/image_size_small"
android:layout_height="@dimen/image_size_small"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/margin_default"
android:layout_marginRight="@dimen/margin_default"
android:src="@drawable/ic_expand" />
<com.github.chuross.library.ExpandableLayout
android:id="@+id/rv_expaner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/img_arrow_1"
app:exl_duration="1000">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/padding_small">
</android.support.v7.widget.RecyclerView>
</com.github.chuross.library.ExpandableLayout>
</RelativeLayout>
///another recycles
and I duplicate it 9 times on XML.
Activity
RecyclerView rv1 = findViewById(R.id.rv1);
RecyclerView rv2 = findViewById(R.id.rv2);
//another 8 RV.
...
rv1Adapter = new RVAdapter(this, initializList1(this));
rv2Adapter = new RVAdapter(this, initializList2(this));
//another 8 adapters
...
rv1.setAdapter(rv1Adapter);
rv2.setAdapter(rv2Adapter);
...
//another 8 setters
RecyclerView.LayoutManager layoutManagerForRv1 = new GridLayoutManager(this, 3);
RecyclerView.LayoutManager layoutManagerForRv2 = new GridLayoutManager(this, 3);
...
//another 8 managers
rv1.setLayoutManager(layoutManagerForRv1);
rv2.setLayoutManager(layoutManagerForRv2);
...
//another 8 setters for managers
RelativeLayout rv1Expander = findViewById(R.id.rv_expander1);
RelativeLayout rv2Expander = findViewById(R.id.rv_expander2);
...
//another 8 RL
rv1Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander1));
rv2Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander2));
...
//another 8 listeners
ExpanderLayoutHelper
- using for expand/collapse animation of RV:
public class ExpanderLayoutHelper implements View.OnClickListener {
RelativeLayout expandWrapper;
ImageView arrow;
ExpandableLayout expandableLayout;
ExpanderLayoutHelper(int relativeLayoutId) {
this.expandWrapper = findViewById(relativeLayoutId);
this.arrow = (ImageView) expandWrapper.getChildAt(1);
this.expandableLayout = (ExpandableLayout) expandWrapper.getChildAt(2);
}
@Override
public void onClick(View v) {
if (expandableLayout.isCollapsed()) {
expandableLayout.expand();
expandWrapper.getChildAt(1).animate().rotation(90f).setDuration(1000);
} else {
expandableLayout.collapse();
arrow.animate().rotation(0).setDuration(1000);
}
}
}
Other points will be here if i remember something important.
initializeList()
is just 1-20list.add("something")
operation. For every form I have unique lists, so I have 10 initialize methods now.When I draw 10 recyclers without adapters lists initialization, the app is not lagging. So, it lags about lines
adapter = new RVAdapter(this, initialize(this));
. I know I can try to solve it with multithread, but bad code and XML is not gone.
java performance android xml
My app is several checkboxes areas. On some event data from all checkboxes will be saved/sent/etc.
All is working, but this Activity is loading about 7 seconds because my code is bad, so I need help in refactoring and optimize it.
How it looks in the app:
I have 10 forms with ~ 100 checkboxes summary. To draw it, I'm using 10 recyclers with 10 adapters. Every adapter initialize with his own list and have own layout manager.
How can I make this code good?
I can't pass all code, it's too large, so I give it apart.
To draw one recycler I use it (variable names changed):
//toolbar and questform
...
<RelativeLayout android:id="@+id/rv_wrapper1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/padding_default">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:text="@string/title1"
android:textSize="@dimen/text_size_big" />
<ImageView
android:id="@+id/img_arrow_1"
android:layout_width="@dimen/image_size_small"
android:layout_height="@dimen/image_size_small"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/margin_default"
android:layout_marginRight="@dimen/margin_default"
android:src="@drawable/ic_expand" />
<com.github.chuross.library.ExpandableLayout
android:id="@+id/rv_expaner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/img_arrow_1"
app:exl_duration="1000">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/padding_small">
</android.support.v7.widget.RecyclerView>
</com.github.chuross.library.ExpandableLayout>
</RelativeLayout>
///another recycles
and I duplicate it 9 times on XML.
Activity
RecyclerView rv1 = findViewById(R.id.rv1);
RecyclerView rv2 = findViewById(R.id.rv2);
//another 8 RV.
...
rv1Adapter = new RVAdapter(this, initializList1(this));
rv2Adapter = new RVAdapter(this, initializList2(this));
//another 8 adapters
...
rv1.setAdapter(rv1Adapter);
rv2.setAdapter(rv2Adapter);
...
//another 8 setters
RecyclerView.LayoutManager layoutManagerForRv1 = new GridLayoutManager(this, 3);
RecyclerView.LayoutManager layoutManagerForRv2 = new GridLayoutManager(this, 3);
...
//another 8 managers
rv1.setLayoutManager(layoutManagerForRv1);
rv2.setLayoutManager(layoutManagerForRv2);
...
//another 8 setters for managers
RelativeLayout rv1Expander = findViewById(R.id.rv_expander1);
RelativeLayout rv2Expander = findViewById(R.id.rv_expander2);
...
//another 8 RL
rv1Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander1));
rv2Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander2));
...
//another 8 listeners
ExpanderLayoutHelper
- using for expand/collapse animation of RV:
public class ExpanderLayoutHelper implements View.OnClickListener {
RelativeLayout expandWrapper;
ImageView arrow;
ExpandableLayout expandableLayout;
ExpanderLayoutHelper(int relativeLayoutId) {
this.expandWrapper = findViewById(relativeLayoutId);
this.arrow = (ImageView) expandWrapper.getChildAt(1);
this.expandableLayout = (ExpandableLayout) expandWrapper.getChildAt(2);
}
@Override
public void onClick(View v) {
if (expandableLayout.isCollapsed()) {
expandableLayout.expand();
expandWrapper.getChildAt(1).animate().rotation(90f).setDuration(1000);
} else {
expandableLayout.collapse();
arrow.animate().rotation(0).setDuration(1000);
}
}
}
Other points will be here if i remember something important.
initializeList()
is just 1-20list.add("something")
operation. For every form I have unique lists, so I have 10 initialize methods now.When I draw 10 recyclers without adapters lists initialization, the app is not lagging. So, it lags about lines
adapter = new RVAdapter(this, initialize(this));
. I know I can try to solve it with multithread, but bad code and XML is not gone.
java performance android xml
java performance android xml
edited 2 hours ago
Jamal♦
30.3k11116226
30.3k11116226
asked yesterday
KirstenLy
514
514
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:
Extract from 'MainActivity':
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask
or threading.
Layout file:
<?xml version="1.0" encoding="utf-8"?>
<!-- This is an example of an tabbed layout -->
<!-- @rem:Expandable areas of an layout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:paddingBottom="30dp"
android:text="Collapsing checkboxes"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=".5">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Checkbox area 1 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_1"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 1"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_1"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_1"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of Area 1 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_1_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 2 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_2"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 2"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_2"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_2"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 2 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_2_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 3 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_3"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 3"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_3"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_3"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 3 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_3_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
Main Activity:
package berthold.collapsingcheckboxarea;
/**
* Collapsing/ expandable layout example.
*
* @rem: Shows how parts of the layout can be collapsed, expanded@@
* @rem: Shows how groups of layout elements can be set on a listener@@
* @rem: and identified by an unique tag@@
*
* Applicable for a finite number of elements (expandable/ collapsing
* areas of the layout and clickable elements in each area).
*
* If the number of expandable areas is not known and/ or will grow dynamically to a
* large number, then one should use 'ListView' or 'RecyclerView'
*/
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RelativeLayout;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// Check box area 1
private Button checkboxAreaOneExpand;
private RelativeLayout contentsOfCheckboxAreaOne;
// Check box area 2
private Button checkboxAreaTwoExpand;
private RelativeLayout contentsOfCheckboxAreaTwo;
// Check box area 3
private Button checkboxAreaThreeExpand;
private RelativeLayout contentsOfCheckboxAreaThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// UI
checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);
checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);
checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);
// Listeners for expand/ collapse buttons
// Check box area one
checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
}
});
// Check box area two
checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
}
});
// Check box area three
checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
}
});
// Inner Class contains callback method which will be executed, when
// a checkbox was changed.
CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
// Insert code to act accordingly.....
// The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
// the checkbox consecutively.....
Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
}
};
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
}
/*
* Toggle view, change button accordingly.....
*/
private void toggleView(Button b, RelativeLayout v){
if (v.isShown()) {
b.setText("+");
v.setVisibility(View.GONE);
} else {
b.setText("-");
v.setVisibility(View.VISIBLE);
}
}
}
New contributor
You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
– Jamal♦
2 hours ago
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210541%2fandroid-app-with-several-checkbox-areas%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:
Extract from 'MainActivity':
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask
or threading.
Layout file:
<?xml version="1.0" encoding="utf-8"?>
<!-- This is an example of an tabbed layout -->
<!-- @rem:Expandable areas of an layout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:paddingBottom="30dp"
android:text="Collapsing checkboxes"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=".5">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Checkbox area 1 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_1"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 1"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_1"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_1"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of Area 1 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_1_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 2 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_2"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 2"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_2"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_2"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 2 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_2_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 3 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_3"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 3"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_3"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_3"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 3 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_3_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
Main Activity:
package berthold.collapsingcheckboxarea;
/**
* Collapsing/ expandable layout example.
*
* @rem: Shows how parts of the layout can be collapsed, expanded@@
* @rem: Shows how groups of layout elements can be set on a listener@@
* @rem: and identified by an unique tag@@
*
* Applicable for a finite number of elements (expandable/ collapsing
* areas of the layout and clickable elements in each area).
*
* If the number of expandable areas is not known and/ or will grow dynamically to a
* large number, then one should use 'ListView' or 'RecyclerView'
*/
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RelativeLayout;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// Check box area 1
private Button checkboxAreaOneExpand;
private RelativeLayout contentsOfCheckboxAreaOne;
// Check box area 2
private Button checkboxAreaTwoExpand;
private RelativeLayout contentsOfCheckboxAreaTwo;
// Check box area 3
private Button checkboxAreaThreeExpand;
private RelativeLayout contentsOfCheckboxAreaThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// UI
checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);
checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);
checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);
// Listeners for expand/ collapse buttons
// Check box area one
checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
}
});
// Check box area two
checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
}
});
// Check box area three
checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
}
});
// Inner Class contains callback method which will be executed, when
// a checkbox was changed.
CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
// Insert code to act accordingly.....
// The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
// the checkbox consecutively.....
Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
}
};
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
}
/*
* Toggle view, change button accordingly.....
*/
private void toggleView(Button b, RelativeLayout v){
if (v.isShown()) {
b.setText("+");
v.setVisibility(View.GONE);
} else {
b.setText("-");
v.setVisibility(View.VISIBLE);
}
}
}
New contributor
You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
– Jamal♦
2 hours ago
add a comment |
As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:
Extract from 'MainActivity':
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask
or threading.
Layout file:
<?xml version="1.0" encoding="utf-8"?>
<!-- This is an example of an tabbed layout -->
<!-- @rem:Expandable areas of an layout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:paddingBottom="30dp"
android:text="Collapsing checkboxes"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=".5">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Checkbox area 1 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_1"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 1"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_1"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_1"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of Area 1 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_1_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 2 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_2"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 2"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_2"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_2"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 2 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_2_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 3 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_3"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 3"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_3"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_3"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 3 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_3_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
Main Activity:
package berthold.collapsingcheckboxarea;
/**
* Collapsing/ expandable layout example.
*
* @rem: Shows how parts of the layout can be collapsed, expanded@@
* @rem: Shows how groups of layout elements can be set on a listener@@
* @rem: and identified by an unique tag@@
*
* Applicable for a finite number of elements (expandable/ collapsing
* areas of the layout and clickable elements in each area).
*
* If the number of expandable areas is not known and/ or will grow dynamically to a
* large number, then one should use 'ListView' or 'RecyclerView'
*/
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RelativeLayout;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// Check box area 1
private Button checkboxAreaOneExpand;
private RelativeLayout contentsOfCheckboxAreaOne;
// Check box area 2
private Button checkboxAreaTwoExpand;
private RelativeLayout contentsOfCheckboxAreaTwo;
// Check box area 3
private Button checkboxAreaThreeExpand;
private RelativeLayout contentsOfCheckboxAreaThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// UI
checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);
checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);
checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);
// Listeners for expand/ collapse buttons
// Check box area one
checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
}
});
// Check box area two
checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
}
});
// Check box area three
checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
}
});
// Inner Class contains callback method which will be executed, when
// a checkbox was changed.
CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
// Insert code to act accordingly.....
// The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
// the checkbox consecutively.....
Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
}
};
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
}
/*
* Toggle view, change button accordingly.....
*/
private void toggleView(Button b, RelativeLayout v){
if (v.isShown()) {
b.setText("+");
v.setVisibility(View.GONE);
} else {
b.setText("-");
v.setVisibility(View.VISIBLE);
}
}
}
New contributor
You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
– Jamal♦
2 hours ago
add a comment |
As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:
Extract from 'MainActivity':
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask
or threading.
Layout file:
<?xml version="1.0" encoding="utf-8"?>
<!-- This is an example of an tabbed layout -->
<!-- @rem:Expandable areas of an layout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:paddingBottom="30dp"
android:text="Collapsing checkboxes"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=".5">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Checkbox area 1 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_1"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 1"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_1"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_1"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of Area 1 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_1_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 2 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_2"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 2"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_2"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_2"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 2 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_2_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 3 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_3"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 3"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_3"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_3"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 3 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_3_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
Main Activity:
package berthold.collapsingcheckboxarea;
/**
* Collapsing/ expandable layout example.
*
* @rem: Shows how parts of the layout can be collapsed, expanded@@
* @rem: Shows how groups of layout elements can be set on a listener@@
* @rem: and identified by an unique tag@@
*
* Applicable for a finite number of elements (expandable/ collapsing
* areas of the layout and clickable elements in each area).
*
* If the number of expandable areas is not known and/ or will grow dynamically to a
* large number, then one should use 'ListView' or 'RecyclerView'
*/
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RelativeLayout;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// Check box area 1
private Button checkboxAreaOneExpand;
private RelativeLayout contentsOfCheckboxAreaOne;
// Check box area 2
private Button checkboxAreaTwoExpand;
private RelativeLayout contentsOfCheckboxAreaTwo;
// Check box area 3
private Button checkboxAreaThreeExpand;
private RelativeLayout contentsOfCheckboxAreaThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// UI
checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);
checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);
checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);
// Listeners for expand/ collapse buttons
// Check box area one
checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
}
});
// Check box area two
checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
}
});
// Check box area three
checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
}
});
// Inner Class contains callback method which will be executed, when
// a checkbox was changed.
CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
// Insert code to act accordingly.....
// The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
// the checkbox consecutively.....
Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
}
};
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
}
/*
* Toggle view, change button accordingly.....
*/
private void toggleView(Button b, RelativeLayout v){
if (v.isShown()) {
b.setText("+");
v.setVisibility(View.GONE);
} else {
b.setText("-");
v.setVisibility(View.VISIBLE);
}
}
}
New contributor
As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:
Extract from 'MainActivity':
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask
or threading.
Layout file:
<?xml version="1.0" encoding="utf-8"?>
<!-- This is an example of an tabbed layout -->
<!-- @rem:Expandable areas of an layout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:paddingBottom="30dp"
android:text="Collapsing checkboxes"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=".5">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Checkbox area 1 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_1"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 1"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_1"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_1"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of Area 1 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_1_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_1_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 2 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_2"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 2"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_2"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_2"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 2 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_2_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_2_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
<!-- Checkbox area 3 -->
<LinearLayout
android:id="@+id/tab_for_checkbox_area_3"
android:orientation="horizontal"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textSize="20dp"
android:text="Checkbox area 3"/>
<Button
android:id="@+id/button_expand_for_checkbox_area_3"
android:text="+"
android:layout_width="0dp"
android:layout_weight=".5"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/tab_contents_of_checkbox_area_3"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Contents of area 3 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox_3_1"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_2"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox_3_3"
android:text="First checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
Main Activity:
package berthold.collapsingcheckboxarea;
/**
* Collapsing/ expandable layout example.
*
* @rem: Shows how parts of the layout can be collapsed, expanded@@
* @rem: Shows how groups of layout elements can be set on a listener@@
* @rem: and identified by an unique tag@@
*
* Applicable for a finite number of elements (expandable/ collapsing
* areas of the layout and clickable elements in each area).
*
* If the number of expandable areas is not known and/ or will grow dynamically to a
* large number, then one should use 'ListView' or 'RecyclerView'
*/
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RelativeLayout;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// Check box area 1
private Button checkboxAreaOneExpand;
private RelativeLayout contentsOfCheckboxAreaOne;
// Check box area 2
private Button checkboxAreaTwoExpand;
private RelativeLayout contentsOfCheckboxAreaTwo;
// Check box area 3
private Button checkboxAreaThreeExpand;
private RelativeLayout contentsOfCheckboxAreaThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// UI
checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);
checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);
checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);
// Listeners for expand/ collapse buttons
// Check box area one
checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
}
});
// Check box area two
checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
}
});
// Check box area three
checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
}
});
// Inner Class contains callback method which will be executed, when
// a checkbox was changed.
CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
// Insert code to act accordingly.....
// The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
// the checkbox consecutively.....
Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
}
};
// Get all checkboxes
// Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
int tag=0; // Consecutive number of checkbox
for (int i=1;i<=3;i++) { // # of checkbox areas
for (int j = 1; j <= 3; j++) { // # of checkboxes per area
int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
CheckBox cb = (CheckBox) findViewById(id);
// Set tag which acts as an unique id for this checkbox
// Set this checkbox on listener....
cb.setTag(++tag); // First checkbox=1....
cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
}
}
}
/*
* Toggle view, change button accordingly.....
*/
private void toggleView(Button b, RelativeLayout v){
if (v.isShown()) {
b.setText("+");
v.setVisibility(View.GONE);
} else {
b.setText("-");
v.setVisibility(View.VISIBLE);
}
}
}
New contributor
edited 2 hours ago
Jamal♦
30.3k11116226
30.3k11116226
New contributor
answered 8 hours ago
Berthold Fritz
93
93
New contributor
New contributor
You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
– Jamal♦
2 hours ago
add a comment |
You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
– Jamal♦
2 hours ago
You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
– Jamal♦
2 hours ago
You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
– Jamal♦
2 hours ago
add a comment |
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210541%2fandroid-app-with-several-checkbox-areas%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown