it-swarm.com.ru

Чем отличается интерфейс OnClickListener с помощью XML и Java кода?

Возможный дубликат:
Разница между событием 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);

Но по мере знакомства с Android я начал понимать значение макетов 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.

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

67
SmashCode

Это точно так же. 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.

161
Guillaume

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

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

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

4
Bill Gary

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

2
kosa