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

Кнопка Click Listeners в Android

Возможный дубликат:
Разница между событием OnClick() и OnClickListener?

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

final Button button = new Button(this);
button.setText("Click to change second line of text");

OnClickListener buttonListener = new View.OnClickListener() {
    boolean clicked = false;
    int numClicks = 0;

    @Override
    public void onClick(View v) {
        if(numClicks > 5) {
            button.setText("STOP IT");
        }
        numClicks++;
        if(clicked == false){
            clicked = true;
            tv2.setText("Text Changed on Button Click");    
        }
        else
        {
            clicked = false;
            tv2.setText("Click again");
        }       
    }
};
button.setOnClickListener(buttonListener);

Но по мере того, как я больше знаком с андроидом, я начал понимать значение макетов xml и реализованных кнопок, таких как

    <Button
    android:id="@+id/button1"
    android:layout_height = "wrap_content"
    android:layout_width ="wrap_content"
    android:text = "lets do this"
    android:onClick = "DoIt"
    />

В макете xml, где DoIt был определен в java.

Мой вопрос в том, являются ли эти 2 метода функционально одинаковыми? Есть ли OnClickListener, который определяется компилятором где-то за кулисами? Есть ли какие-либо функции, которыми вы торгуете, используя один или другой способ?

4b9b3361

Ответ 1

Это точно то же самое. android:onClick был добавлен в уровень API 4, чтобы упростить его, больше Javascript-веб-подобных и вывести все из XML. Внутренняя добавка: OnClickListener на кнопке, которая вызывает ваш метод DoIt.

Вот что делает с помощью android:onClick="DoIt" внутри:

Button button= (Button) findViewById(R.id.buttonId);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DoIt(v);
    }
});

Единственное, с чем вы торгуете, используя android:onClick, как обычно, с конфигурацией XML, заключается в том, что добавлять динамический контент становится немного сложнее (программно вы можете добавить одного слушателя или другого в зависимости от ваших переменных), Но это легко победить, добавив ваш тест в метод DoIt.

Ответ 2

используя XML, вам нужно установить прослушиватель onclick самостоятельно. Сначала введите свой класс implements OnClickListener, затем добавьте переменную Button button1;, затем добавьте ее в свой onCreate()

button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);

когда вы реализуете OnClickListener, вам нужно добавить унаследованный метод onClick(), где вы будете обрабатывать свои клики

Ответ 3

Даже если вы определяете android: onClick = "DoIt" в XML, вам нужно убедиться, что ваша активность (или контекст представления) имеет открытый метод, определенный с тем же именем и параметр View as. Android проводит ваши определения с этой реализацией в действии. В конце реализация будет иметь тот же код, который вы написали в анонимном внутреннем классе. Итак, в простых словах вместо того, чтобы иметь аттрибут внутреннего класса и слушателя в действии, вы просто будете иметь открытый метод с кодом реализации.