Кнопка Android setOnClickListener Design - PullRequest
43 голосов
/ 08 апреля 2011

Я создаю приложение для 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}
    } 
});

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

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

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

Ответы [ 9 ]

52 голосов
/ 08 апреля 2011

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

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

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

class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}
27 голосов
/ 08 апреля 2011

Реализуйте OnClickListener () в своей деятельности ...

public class MyActivity extends Activity implements View.OnClickListener {
}

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

buttonX.setOnClickListener(this);

В тесте метода Activity onClick () для какой кнопки онаis ...

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

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

11 голосов
/ 07 мая 2013

Android-решение lambada

public void registerButtons(){
    register(R.id.buttonName1, ()-> {/*Your code goes here*/});
    register(R.id.buttonName2, ()-> {/*Your code goes here*/});
    register(R.id.buttonName3, ()-> {/*Your code goes here*/});
}

private void register(int buttonResourceId, Runnable r){
    findViewById(buttonResourceId).setOnClickListener(v -> r.run());
}

Решение для случая коммутатора

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;
        }
    }
};
9 голосов
/ 08 апреля 2011

Поскольку setOnClickListener определено для View, а не Button, если вам не нужна переменная для чего-то другого, вы можете сделать ее немного более краткой, например:

findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});
6 голосов
/ 26 мая 2012

Вы можете использовать массив для обработки нескольких прослушивателей нажатий кнопок в 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, если вы не знаете, как его написать. wesagnd@yahoo.com

3 голосов
/ 08 апреля 2011

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

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

1 голос
/ 17 мая 2018
public class MyActivity extends AppCompatActivity implements View.OnClickListener {

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

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id) {

            case R.id.button:

                  // Write your code here first button

                break;

             case R.id.button2:

                  // Write your code here for second button

                break;

        }

    }

}
1 голос
/ 09 февраля 2018

Реализация действия с View.OnClickListener, как показано ниже.

public class MyActivity extends AppCompatActivity implements View.OnClickListener {

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

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id) {

            case R.id.button:

                  // Write your code here first button

                break;

             case R.id.button2:

                  // Write your code here for second button

                break;

        }

    }

}
1 голос
/ 06 декабря 2015
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();
    }

}
...