Switch Statement with Button pressed - android

So I push either button1, button2, button3, or button4. Pushing any of these Buttons calls method buttonPressed(View v). I want to use a different case depending on the button pressed. For example:
public void buttonPressed(View v){
switch(v){
case button1:
//do something
case button2:
//do something
case button3:
//do something
case button4:
//do something
}}
Obviously, this does not work. I cannot use a switch statement with a View. What is the easiest and most efficient solution to this problem? Thanks!!
Note: I am using android:onClick="buttonPressed" in my .xml

You need to switch on the View's ID, not the View itself
public void buttonPressed(View v){
switch(v.getId()) {
case R.id.ButtonOneID:
//do something
break;
case R.id.ButtonTwoID:
//do something
break;
case R.id.ButtonThreeID:
//do something
break;
case R.id.ButtonFourID:
//do something
break;
}
}

public void buttonPressed(View v){
int id = v.getId();
switch(id){
case button1.getId();
//do something
break;
case button2.getId();
//do something
break;
case button3.getId();
//do something
break;
case button4.getId();
//do something
break;
}
}

Related

switch case using variables, repetitive code

I have 50 Buttons. I use the switch statement as shown below. Each case has the same On-Click code. But I make many changes to the code for each Button, and it's really tedious work and very repetitive to change the code the same way 50 times. My code currently looks like this:
public void ButtonOnClick(View v) {
switch (v.getId()) {
case button1:
if(button_list.get(1).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(1).getText().toString());
is_clicked= (String)button_list.get(1).getTag();
if ("0".equals(is_clicked)){
button_list.get(1).setBackgroundResource(R.drawable.button_pressed);
button_list.get(1).setTag("1");
}else{
button_list.get(1).setBackgroundResource(R.drawable.button_normal);
button_list.get(1).setTag("0");
}
break;
case button2:
if(button_list.get(2).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(2).getText().toString());
is_clicked= (String)button_list.get(2).getTag();
if ("0".equals(is_clicked)){
button_list.get(2).setBackgroundResource(R.drawable.button_pressed);
button_list.get(2).setTag("1");
}else{
button_list.get(2).setBackgroundResource(R.drawable.button_normal);
button_list.get(2).setTag("0");
}
break;
case button3:
if(button_list.get(3).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(3).getText().toString());
is_clicked= (String)button_list.get(3).getTag();
if ("0".equals(is_clicked)){
button_list.get(3).setBackgroundResource(R.drawable.button_pressed);
button_list.get(3).setTag("1");
}else{
button_list.get(3).setBackgroundResource(R.drawable.button_normal);
button_list.get(3).setTag("0");
}
break;
case button4:
if(button_list.get(4).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(4).getText().toString());
is_clicked= (String)button_list.get(4).getTag();
if ("0".equals(is_clicked)){
button_list.get(4).setBackgroundResource(R.drawable.button_pressed);
button_list.get(4).setTag("1");
}else{
button_list.get(4).setBackgroundResource(R.drawable.button_normal);
button_list.get(4).setTag("0");
}
break;
case button5:
if(button_list.get(5).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(5).getText().toString());
is_clicked= (String)button_list.get(5).getTag();
if ("0".equals(is_clicked)){
button_list.get(5).setBackgroundResource(R.drawable.button_pressed);
button_list.get(5).setTag("1");
}else{
button_list.get(5).setBackgroundResource(R.drawable.button_normal);
button_list.get(5).setTag("0");
}
break;
case button6:
if(button_list.get(6).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(6).getText().toString());
is_clicked= (String)button_list.get(6).getTag();
if ("0".equals(is_clicked)){
button_list.get(6).setBackgroundResource(R.drawable.button_pressed);
button_list.get(6).setTag("1");
}else{
button_list.get(6).setBackgroundResource(R.drawable.button_normal);
button_list.get(6).setTag("0");
}
break;
case button7:
if(button_list.get(7).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(7).getText().toString());
is_clicked= (String)button_list.get(7).getTag();
if ("0".equals(is_clicked)){
button_list.get(7).setBackgroundResource(R.drawable.button_pressed);
button_list.get(7).setTag("1");
}else{
button_list.get(7).setBackgroundResource(R.drawable.button_normal);
button_list.get(7).setTag("0");
}
break;
case button8:
if(button_list.get(8).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(8).getText().toString());
is_clicked= (String)button_list.get(8).getTag();
if ("0".equals(is_clicked)){
button_list.get(8).setBackgroundResource(R.drawable.button_pressed);
button_list.get(8).setTag("1");
}else{
button_list.get(8).setBackgroundResource(R.drawable.button_normal);
button_list.get(8).setTag("0");
}
break;
case button9:
if(button_list.get(9).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(9).getText().toString());
is_clicked= (String)button_list.get(9).getTag();
if ("0".equals(is_clicked)){
button_list.get(9).setBackgroundResource(R.drawable.button_pressed);
button_list.get(9).setTag("1");
}else{
button_list.get(9).setBackgroundResource(R.drawable.button_normal);
button_list.get(9).setTag("0");
}
break;
case button10:
if(button_list.get(10).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(10).getText().toString());
is_clicked= (String)button_list.get(10).getTag();
if ("0".equals(is_clicked)){
button_list.get(10).setBackgroundResource(R.drawable.button_pressed);
button_list.get(10).setTag("1");
}else{
button_list.get(10).setBackgroundResource(R.drawable.button_normal);
button_list.get(10).setTag("0");
}
break;
Is there a way I can use a general variable to access each case so if I make a change I won't need to make it 50 times for each button? I thought about doing something like this:
public void ButtonOnClick(View v) {
switch (v.getId()) {
case button[i]
if(button_list.get(i).getTag().equals("0"))
enter_txt.setText(enter_txt.getText()+button_list.get(i).getText().toString());
is_clicked= (String)button_list.get(i).getTag();
if ("0".equals(is_clicked)){
button_list.get(i).setBackgroundResource(R.drawable.button_pressed);
button_list.get(i).setTag("1");
}else{
button_list.get(i).setBackgroundResource(R.drawable.button_normal);
button_list.get(i).setTag("0");
}
break;
Would this work? Or is there something else I need to do so I don't need to make 50 changes to my code every time I decide I want to change the OnClick method?
I'm going to assume that ButtonOnClick is the click handler for the buttons. I'm going to further assume that for any i, the contents of button_list.get(i) is the button. If that's right, then the argument v is the same Button object stored in the list. You can then reduce your entire handler to:
public void ButtonOnClick(View v) {
Button btn = (Button) v;
if (btn.getTag().equals("0")) {
enter_txt.setText(enter_txt.getText()+btn.getText().toString());
}
is_clicked= (String) btn.getTag();
if ("0".equals(is_clicked)){
btn.setBackgroundResource(R.drawable.button_pressed);
btn.setTag("1");
}else{
btn.setBackgroundResource(R.drawable.button_normal);
btn.setTag("0");
}
}
As an aside, you might consider using Boolean objects instead of String objects as the button tags.
First you should never copy paste code, try to extract your code in another method.
If you are using a arraylist where you store all your buttons, you can probably use the ArrayList.indexOf(Object o)
So just replace your ButtonOnClick method with this one, you can handle other buttons behavior easily too in the future :
public void ButtonOnClick(View v) {
if(button_list.contains(v))
{
setButtonBackground(button_list.indexOf(v));
}
}
private setButtonBackground(int buttonNumber)
{
Button myButton = (Button) button_list.get(buttonNumber);
if(myButton.getTag().equals("0"))
{
enter_txt.setText(enter_txt.getText()+myButton.getText().toString());
}
is_clicked = (String) myButton.getTag();
if ("0".equals(is_clicked))
{
myButton.setBackgroundResource(R.drawable.button_pressed);
myButton.setTag("1");
}
else
{
myButton.setBackgroundResource(R.drawable.button_normal);
myButton.setTag("0");
}
}
When you are developping instead of copy and paste code, just use the shortcut extract to a method so you will get something like this and will save yourself time.
[...]
case button1:
setButtonBackground(1);
break;
case button2:
setButtonBackground(2);
break;
[...]
Let me know if it works for you

Android - Unexpected layout

i haven't many experience in android development. this is my code:
public void onClick(View v) {
switch(v.getId()){
case R.id.categoriaA1:
myAvatar.setBackgroundResource(R.drawable.cata1);
case R.id.categoriaA2:
myAvatar.setBackgroundResource(R.drawable.cata2);
case R.id.categoriaA3:
myAvatar.setBackgroundResource(R.drawable.cata3);
case R.id.categoriaA4:
myAvatar.setBackgroundResource(R.drawable.cata4);
}
myAvatar is an ImageView.
when i click in one of the four imageButton , the result is always the same: Case R.id.categoriaA4.
Why??
You need to add break to each case. like
switch(v.getId()){
case R.id.categoriaA1:
myAvatar.setBackgroundResource(R.drawable.cata1);
break;
case R.id.categoriaA2:
myAvatar.setBackgroundResource(R.drawable.cata2);
break;
case R.id.categoriaA3:
myAvatar.setBackgroundResource(R.drawable.cata3);
break;
case R.id.categoriaA4:
myAvatar.setBackgroundResource(R.drawable.cata4);
break;
}

onClick event buttons

I have 5 buttons,each of them open another activity. How to make clickeble only one of them at current moment?When i click 2 different buttons simultaneusly onClick event calls 2 times and 2 different activities opens. How can i resolve my problem. Thanks.My code
public void onClick(View v)
{
switch (v.getId())
{
case R.id.play_button:
onPlayClick();
setButtonsEnable(false);
break;
case R.id.difficalty_button:
onDifficultyClick();
setButtonsEnable(false);
break;
case R.id.hight_scores_button:
onHighScoresClick();
setButtonsEnable(false);
break;
case R.id.share_button:
setButtonsEnable(false);
break;
case R.id.turn_off_button:
onLeaderboardClick();
setButtonsEnable(false);
break;
default:
break;
}
}
After return to main activity i make my buttons clickable
protected void onResume() {
super.onResume();
setButtonsEnable(true);
}
public void setButtonsEnable(boolean config)
{
playBtn.setClickable(config);
difficultyBtn.setClickable(config);
hScoreBtn.setClickable(config);
shareBtn.setClickable(config);
turnOffButton.setClickable(config);
}
setOnClickListener(null)
would do the trick or you can make
setClickable(false)
Maybe what you really need is RadioGroup? It allows out of the box to select click/select only one button at the time.
Doc reference
Tutorial
Create a variable clicked in Activity:
boolean clicked=false;
Set this value in onClick code:
public void onClick(View v)
{
if(!clicked){
clicked=true;
switch (v.getId())
{
case R.id.play_button:
onPlayClick();
setButtonsEnable(false);
break;
case R.id.difficalty_button:
onDifficultyClick();
setButtonsEnable(false);
break;
case R.id.hight_scores_button:
onHighScoresClick();
setButtonsEnable(false);
break;
case R.id.share_button:
setButtonsEnable(false);
break;
case R.id.turn_off_button:
onLeaderboardClick();
setButtonsEnable(false);
break;
default:
break;
}}
}
If you want to open an activity on each click, use a onclicklistener for each button or add a method call in the xml layout via android:onClick="someMethod", when you click a button and call another activity the UI should block itself...have you tried it this way?

android re active typing in edittext

I have an edittext, i want it to be not editable at first, so i did this
et_more.setKeyListener(null);
when a user select radiobutton i want to re active the edittext again
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.rb_dialog_price_limit_more:
break;
case R.id.rb_dialog_price_limit_less:
break;
default:
break;
}
}
that was the onclick , what should i put inside case break please?
I want to make it active again
instead of et_more.setKeyListener(null);
You can try et_more.setEnabled(false); and in your switch put et_more.setEnabled(true);

So, why is my switch case affecting all the following cases?

So, I'm trying to set up a series of checkboxes that, when clicked, will add a number, depending on the checkbox to either the int variable attackTotal or damageTotal, which will in turn be shown in some textviews.
Currently, however, clicking the top checkbox acts as if I had clicked both it, and every checkbox after it in the switch statement. The second clickbox seems to activate itself and all the following ones as well, etcetera etcetera...
So here's the code I've gotten together.
public void onCheckboxClicked(View v) {
// Is the view now checked?
boolean checked = ((CheckBox) v).isChecked();
// Check which checkbox was clicked
switch(v.getId()) {
case R.id.checkBox1:
if (checked)
{
flankAttack=2;
}
else
{
flankAttack=0;
}
case R.id.checkBox2:
if (checked)
{
pbs=1;
}
else
{
pbs=0;
}
all the way down to..
case R.id.checkBox10:
if (checked)
{
attackTotal=attack+flankAttack+pbs;
damageTotal=damage+pbs;
TextView textView = (TextView) findViewById(R.id.textView2);
TextView textView2 = (TextView) findViewById(R.id.textView4);
textView.setText(Integer.toString(attackTotal));
textView2.setText(Integer.toString(damageTotal));
}
else
{
attackTotal=attack+flankAttack+pbs;
damageTotal=damage+pbs;
TextView textView = (TextView) findViewById(R.id.textView2);
TextView textView2 = (TextView) findViewById(R.id.textView4);
textView.setText(Integer.toString(attackTotal));
textView2.setText(Integer.toString(damageTotal));
}
I only started trying to figure out this programming stuff on Friday, so be gentle.
just before case R.id.checkBox2: you need to have a break; to tell the program to break from the switch statement. Otherwise anything meeting R.id.checkBox1 just continue through and executes all the logic you have for R.id.checkBox2 as well. (You need break; before all your other cases as well).
You forgot adding
break;
in the end of every case.
You forgot the break statement after each case. It is falling through to the next case each time.
Also, I strongly recommend not to put more than a few lines of code in a case statement, else it gets ugly very fast and hard to work with. Instead, pull out each case into its own method. Usually it will be easy to come up with a good name for each that is self-documenting:
switch (foo) {
case 0:
do();
lots();
of();
things();
break;
case 1:
do();
other();
things();
break;
case 2:
if (ugly)
{
this_gets();
messy();
quickly();
}
else
{
we_could();
do_better();
}
break;
}
Becomes:
void do_case_0() {
do();
lots();
of();
things();
}
void do_case_1() {
do();
other();
things();
}
void do_case_2() {
if (ugly)
{
this_gets();
messy();
quickly();
}
else
{
we_could();
do_better();
}
}
// ...
switch (foo) {
case 0: do_case_0(); break;
case 1: do_case_1(); break;
case 2: do_case_2(); break;
}

Categories

Resources