Android: onClick xml не выполняется

Я пытаюсь сделать простое приложение с одним макетом и двумя кнопками, которые будут менять текст макета. Но я не могу найти решение, почему android:onClick не выполняется. И после попытки с OnClickListener, который не работал, но как здесь: from-setonclicklistene">Чем именно XML-атрибут android:onClick отличается от setOnClickListener?

Я прочитал и выполнил руководство на веб-сайте ANdroid SDK здесь: http://developer.android.com/reference/android/widget/Button.html

Это мой XML-код:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/maintext"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.00"
    android:text="@string/hello_world" />

<Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Button1"  />

<Button
    android:id="@+id/button2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Button2"  />

Here is my Java code:

public class MainActivity extends Activity implements OnClickListener{

    TextView label1;
int stage;
Button button1, button2;


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

    label1 = new TextView(this);
    TextView label1 = (TextView) findViewById(R.id.maintext);

    stage = 1;
    label1.setText("hello " + stage);
    Log.d("HiThereActivity", "THIS IS DEBUG OUTPUT TO LOGCAT"); //working

    button1 = new Button(this);
    button2 = new Button(this);

    button1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            button1_click(v);
            Log.d("button1 working", "THIS IS DEBUG OUTPUT TO LOGCAT"); //not appearing
        }
    });
    button2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            button2_click(v);
            Log.d("button2 working", "THIS IS DEBUG OUTPUT TO LOGCAT"); //not appearing
        }
    });
}

public void button1_click(View v) {

    stage = 2;
    label1.setText("hello " + stage);
    Log.d("b1click", "THIS IS DEBUG OUTPUT TO LOGCAT"); //not appearing

}

public void button2_click(View v) {

    stage = 3;
    label1.setText("hello " + stage);
    Log.d("b2click", "THIS IS DEBUG OUTPUT TO LOGCAT"); //not appearing
}

@Override
public void onClick(View v) {
    Log.d("wrong method", "THIS IS DEBUG OUTPUT TO LOGCAT"); // not appearing
}}

Таким образом, единственное сообщение Logcat, которое я получаю, - это сообщение в методе OnCreate. Переменная этапа всегда остается равной 1 и не изменяется, когда я нажимаю кнопки. Однако кнопки анимируют щелчок, поэтому это должен быть либо OnClick, либо сама метка, которая не работает.

Изображение работающего эмулятора: http://i.stack.imgur.com/ioUoD.png< /а>

Заранее спасибо!


person Taumich    schedule 20.06.2013    source источник


Ответы (3)


Это потому, что кнопки, которые вы нажимаете, на самом деле не относятся к тем, которые определены в файле макета XML. С этим заявлением:

button1 = new Button(this);

вы создаете новую кнопку, но не ссылаетесь на те, которые объявлены в макете XML.

Правильный способ — получить ссылку на кнопку, объявленную в макете XML:

button1 = (Button)findViewById(R.id.button1);
button2 = (Button)findViewById(R.id.button2);
person Andy Res    schedule 20.06.2013
comment
О, спасибо! Не думал об этом, так как я новичок в xml :) - person Taumich; 20.06.2013

Не используйте

Button button1 = new Button(this);

так как это создает новую кнопку, а не привязывает ее к кнопке, которую вы добавили в свой XML. Вместо этого используйте

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

Аналогично для button2.

person ianhanniballake    schedule 20.06.2013

проблема здесь

    button1 = new Button(this);
    button2 = new Button(this);

вместо использования существующих кнопок вы создаете новые. использовать как

    button1 = findViewById(R.id.button1);
    button2 = findViewById(R.id.button2);

Дополнительная информация

здесь нет необходимости реализовывать onClickListener. вы уже настраиваете прослушиватели отдельно. Так что здесь он не нужен

Дополнительная информация

Кажется, вы новичок в использовании onClickListener. вот разные способы использования этого.

  1. используйте внутренний класс annonymouse в методе setOnClickLIstener, как вы это делали

    button1.setOnClickListener (новый View.OnClickListener() {

    @Override
    public void onClick(View v) {
        button1_click(v);
        Log.d("button1 working", "THIS IS DEBUG OUTPUT TO LOGCAT"); //not appearing
    }
    

    });

  2. Реализовать метод OnClickListener и переопределить метод onClick. но в этом случае не забудьте настроить слушателя как

    button.setOncliClistener(this);
    

или если вы используете другой класс для прослушивания, например

     button.setOnclickListener(thatclass);
  1. мой любимый способ. используйте метод android:onClick в макете xml и объявите метод следующим образом

    android:onClick="onClick"

в классе

    public void onClick(View v){
        // do your tasks
    }
person stinepike    schedule 20.06.2013
comment
Спасибо за информацию! Да, я новичок в большинстве методов Java. Я пока постараюсь придерживаться android:onClick :) - person Taumich; 20.06.2013