1

I have 20 checkbox and togglebutton pairs (cb1, tb1, cb2, tb2,....., cb20, tb20).After clicking one of the controls, I'd like to check to see if both controls in the pair are checked and act accordingly.The following onCreate code is way to cumbersome:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ck1 = (CheckBox) findViewById(R.id.ck1);
    ck2 = (CheckBox) findViewById(R.id.ck2);
    tb1 = (ToggleButton) findViewById(R.id.tb1);
    tb2 = (ToggleButton) findViewById(R.id.tb2);

    ck1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (ck1.isChecked() & tb1.isChecked())  {
                //DO SOMETHING
            };
        }
    });

    ck2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (ck2.isChecked() & tb2.isChecked())  {
                //DO SOMETHING
            };
        }
    });

    tb1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (ck1.isChecked() & tb1.isChecked())  {
                //DO SOMETHING
            };
        }
    });

    tb2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (ck2.isChecked() & tb2.isChecked())  {
                //DO SOMETHING
            };
        }
    });
    //etc.etc.etc.
}

How can I simplify to "loop" through the 20 pairs?

DHHJ
  • 103
  • 1
  • 12
  • You can get the resource from a string, look at http://stackoverflow.com/questions/4427608/android-getting-resource-id-from-string and then loop on the strings using the loop index to get the matching view. – fbwnd Nov 21 '16 at 17:53

1 Answers1

1

Use two arrays to store the id's and let the Activity implement View.OnCLickListener:

public class MyActivity extends Activity implements View.OnClickListener {

    private int[] checkboxes = {R.id.cb1, R.id.cb2, R.id.cb3};
    private int[] togglebuttons = {R.id.tb1, R.id.tb2, R.id.tb3};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);    

        int len = checkboxes.length;
        for (int i = 0; i < len; i++)
        { 
            CheckBox ck = (CheckBox)findViewById(checkboxes[i]);
            ck.setOnClickListener(this);
            ToggleButton tb = (ToggleButton)findViewById(togglebuttons[i]);
            tb.setOnClickListener(this);
        }
    }

    @Override
    public void onClick(View v) {
        int position = -1;
        if (v instanceof CheckBox)
        {
            CheckBox ck = (CheckBox)v;
            if (! ck.isChecked())
                return;

            position = findPosition(v.getId(), checkboxes);

            ToggleButton tb = (ToggleButton)findViewById(togglebuttons[position]);
            if (tb.isChecked())
            {
                doSomething(position);
            }
        }
        else if (v instanceof ToggleButton)
        {
            ToggleButton tb = (ToggleButton)v;
            if (! tb.isChecked())
                return;

            position = findPosition(v.getId(), togglebuttons);

            CheckBox ck = (CheckBox)findViewById(checkboxes[position]);
            if (ck.isChecked())
            {
                doSomething(position);
            }
        }
    }

    private int findPosition(int id, int[] arrayOfIds) {
        int len = arrayOfIds.length;
        for(int i = 0; i < len; i++)
        {
            if (id == arrayOfIds[i])
            { 
               return i;
            }
        }
        return -1; // should not happen
    }

    private void doSomething(int position) {
       // business logic here
    }
}
Bö macht Blau
  • 12,820
  • 5
  • 40
  • 61