Подтвердить что ты не робот

Кнопка Android SetOnClickListener Design Help

Я создаю приложение для Android. Я заметил, что создаю много повторений кода, подобных этому в каждом из моих классов:

Button buttonX = (Button)findViewById(R.id.buttonXName);
// Register the onClick listener with the implementation above
buttonX.setOnClickListener(new OnClickListener() {
    public void onClick(View v)
    {
        //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});

Теперь у меня есть 15 кнопок, и это делает мой код уродливым. Кто-нибудь имеет класс или некоторые примеры, о том, как я могу превратить все эти коды в нечто более эффективное, поэтому я могу:

  • Создать кнопку OBJ {Кнопка ButtonX (Кнопка) findViewById (R.id.buttonXName);}
  • Установите прослушиватель {buttonX.setOnClickListener(новый OnClickListener()}
  • Определите, было ли нажато {public void onClick (View v)}
  • Затем запустите определенный код для каждой кнопки?

Если кто-нибудь знает что-нибудь, я был бы признателен.

4b9b3361

Ответ 1

Если вы нацелились на 1.6 или новее, вы можете использовать android: onClick xml атрибут, чтобы удалить часть повторяющегося кода. См. это сообщение в блоге от Ромена Гая.

<Button 
   android:height="wrap_content"
   android:width="wrap_content"
   android:onClick="myClickHandler" />

И в классе Java используйте следующие строки кода:

class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}

Ответ 2

Внедрите OnClickListener() в свою активность...

public class MyActivity extends Activity implements View.OnClickListener {
}

Для каждой кнопки используйте...

buttonX.setOnClickListener(this);

В вашем методе проверки onClick() для какой кнопки это...

@Override
public void onClick(View view) {
    if (View.equals(buttonX))
        // Do something
}

Также в onClick вы можете использовать view.getId(), чтобы получить идентификатор ресурса, а затем использовать его в блоке switch/case, чтобы идентифицировать каждую кнопку и выполнить соответствующее действие.

Ответ 3

Лучшее решение будет работать с корпусом коммутатора следующим образом:

public void registerButtons(){
    register(R.id.buttonName1);
    register(R.id.buttonName2);
    register(R.id.buttonName3);
}

private void register(int buttonResourceId){
    findViewById(buttonResourceId).setOnClickListener(buttonClickListener);
}

private OnClickListener buttonClickListener = new OnClickListener() {

    @Override
    public void onClick(View v){
        switch (v.getId()) {
            case R.id.buttonName1:
                // TODO Auto-generated method stub
                break;
            case R.id.buttonName2:
                // TODO Auto-generated method stub
                break;
            case View.NO_ID:
            default:
                // TODO Auto-generated method stub
                break;
        }
    }
};

Ответ 4

Так как setOnClickListener определяется на View not Button, если вам не нужна переменная для чего-то еще, вы можете сделать это немного ниже:

findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});

Ответ 5

Вы можете использовать массив для обработки нескольких прослушивателей нажатия кнопок в android следующим образом: здесь я устанавливаю кнопку для прослушивания кнопок для кнопок n, используя массив как:

Button btn[] = new Button[n]; 

ПРИМЕЧАНИЕ: n - постоянное положительное целое число

Пример кода:

//class androidMultipleButtonActions 
package a.b.c.app;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class androidMultipleButtonActions extends Activity implements OnClickListener{
    Button btn[] = new Button[3];

    public void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        btn[0] = (Button) findViewById(R.id.Button1);
        btn[1] = (Button) findViewById(R.id.Button2);
        btn[2] = (Button) findViewById(R.id.Button3);
        for(int i=0; i<3; i++){
            btn[i].setOnClickListener(this);
        }           
    }

    public void onClick(View v) {
        if(v == findViewById(R.id.Button1)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button2)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button3)){
            //do here what u wanna do.
        }
    }
}

Примечание. Сначала напишите файл main.xml, если вы не знаете, как писать, пожалуйста, напишите: [email protected]

Ответ 6

Я думаю, вы обычно можете делать то, что вам нужно, в цикле, что намного лучше, чем многие методы onClick, если это можно сделать.

Отметьте этот ответ для демонстрации того, как использовать цикл для аналогичной проблемы. То, как вы создаете свой цикл, будет зависеть от потребностей ваших функций onClick и того, насколько они похожи друг на друга. Конечный результат - гораздо менее повторяющийся код, который легче поддерживать.

Ответ 7

public class MainActivity extends AppCompatActivity  implements View.OnClickListener{

    Button b1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1=(Button)findViewById(R.id.button);
        b1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(),"Button is Working",Toast.LENGTH_LONG).show();
    }

}