Android setOnClickListener метод - как это работает?

У меня проблемы с пониманием этого кода. Я получаю, что findViewById получит виджет кнопки, а затем его приведёт. Затем он будет использовать кнопку для вызова метода setOnClickListener. Однако я не знаю, что это за аргумент, передаваемый в setOnClickListener и я никогда раньше не видел подобного кода. Как получается, что он создает новый объект, но способен создать собственный метод в другом аргументе метода? Было бы здорово, если бы кто-то мог это объяснить. Кроме того, какой тип объекта setOnClickListener метод setOnClickListener?

btn = (Button)findViewById(R.id.firstButton);
btn.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        tv.setText(months[rand.nextInt(12)]);
        tv.setTextColor(Color.rgb(rand.nextInt(255)+1, rand.nextInt(255)+1, rand.nextInt(255)+1));
    }
});

Ответы

Ответ 1

Это работает так. View.OnClickListenere определено -

public interface OnClickListener {
    void onClick(View v);
}

Насколько нам известно, вы не можете создать экземпляр объекта OnClickListener, так как он не имеет реализованного метода. Таким образом, вы можете выполнить два способа: вы можете реализовать этот интерфейс, который переопределит метод onClick следующим образом:

public class MyListener implements View.OnClickListener {
    @Override
    public void onClick (View v) {
         // your code here;
    }
}

Но утомительно делать это каждый раз, когда вы хотите установить прослушиватель кликов. Поэтому, чтобы этого избежать, вы можете обеспечить реализацию метода на месте, точно так же, как в примере, который вы дали.

setOnClickListener принимает в качестве параметра View.OnClickListener.

Ответ 2

Это лучший способ реализовать Onclicklistener для многих кнопок подряд, реализующих View.onclicklistener.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

Это кнопка в MainActivity

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

    bt_submit = (Button) findViewById(R.id.submit);

    bt_submit.setOnClickListener(this);
}

Это метод переопределения

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.submit:
                //action

                break;

            case R.id.secondbutton:
                //action
                break;
        }
    }

Ответ 3

В этом руководстве говорит о методе setOnClickListener:

public void setOnClickListener (View.OnClickListener l)

Добавлен в уровень API 1 Зарегистрировать обратный вызов, который будет вызываться, когда этот вид щелчок. Если это представление не доступно для кликов, оно становится интерактивным.

Параметры

l View.OnClickListener: обратный вызов, который будет запускаться

И обычно вы должны использовать его так:

public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
        Button button = (Button)findViewById(R.id.corky);
        button.setOnClickListener(this);
    }

    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
    ...
}

Взгляните также на этот урок Построение простого калькулятора с помощью Android Studio.

Ответ 4

это реализация создания объекта класса anonymouse, чтобы облегчить написание кода и сэкономить время