Кнопка OnClick не срабатывает на Android - PullRequest
0 голосов
/ 03 декабря 2011

Я новичок в Android и у меня проблемы с получением кнопок в этой таблице для запуска события OnClick.Цель состоит в том, чтобы иметь таблицу, полную кнопок, и когда они нажаты, сделайте что-нибудь.Сейчас я просто хочу вывести на консоль, но он не будет вызывать метод OnClick.

Я уверен, что это глупая проблема, и я благодарен за помощь.

public class HiThereActivity extends Activity  {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  

        ArrayList<String> names = new ArrayList<String>();

        names.add("Michael");
        names.add("John");
        names.add("Mike");
        names.add("Tom");
        names.add("Steve");

        ArrayList<String> codes = new ArrayList<String>();

        codes.add("abcde");
        codes.add("fghij");
        codes.add("klmno");
        codes.add("pqrst");
        codes.add("uvwxy");
        codes.add("12345");
        codes.add("67890");



        TableLayout table = new TableLayout(this);  

        table.setStretchAllColumns(true);  
        table.setShrinkAllColumns(true);  

        TableRow rowTitle = new TableRow(this);  
        rowTitle.setGravity(Gravity.CENTER_HORIZONTAL);  

        TableRow rowConditions = new TableRow(this);  
        rowConditions.setGravity(Gravity.CENTER);  


        // title column/row  
        TextView title = new TextView(this);  
        title.setText("IH10 Katy Extension - 11/7/2011");  

        title.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);  
        title.setGravity(Gravity.CENTER);  
        title.setTypeface(Typeface.SERIF, Typeface.BOLD);  

        TableRow.LayoutParams params = new TableRow.LayoutParams();  
        params.span = (codes.size() + 1);  

        rowTitle.addView(title, params);  

        Iterator<String> nameItr = names.iterator();
        while(nameItr.hasNext()){
            TableRow row = new TableRow(this);
            TextView nameLable = new TextView(this);
            nameLable.setText(nameItr.next());
            nameLable.setTypeface(Typeface.DEFAULT_BOLD);
            row.addView(nameLable);

            Iterator<String> codeItr = codes.iterator();
            while(codeItr.hasNext()){
                /*TextView codeLabel = new TextView(this);  
                codeLabel.setText(codeItr.next());  
                codeLabel.setTypeface(Typeface.SERIF, Typeface.BOLD);

                row.addView(codeLabel);
                */
                codeItr.next();
                Button rowButton = new Button(this);
                rowButton.setText("8");
                //rowButton.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT));
                rowButton.setOnClickListener(btnListener);


                row.addView(rowButton);


            }
            table.addView(row);
        }


        setContentView(table);  
    }

    private OnClickListener btnListener = new OnClickListener() {
        public void onClick(View v) {
            System.out.println("TEST");
        }
    };


}

РЕДАКТИРОВАТЬ# 1: Я провел некоторые эксперименты и сделал этот очень простой пример, который не вызывает onClick.Я знаю, что это действительно глупо.Есть идеи?

package com.bordeloniphone.timeentry;

import android.app.Activity;
import android.os.Bundle;

import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class TimeEntryActivity extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);

        Button okButton = new Button(this);
        okButton.setText(":)");
        okButton.setOnClickListener(this);
        setContentView(okButton);

    }

public void onClick(View v) {
    Log.d("TEST", "TEST");


}

}

Ответы [ 3 ]

0 голосов
/ 03 декабря 2011

Если вы используете Eclipse, зайдите в Window-> Show View-> Other ... и в группе Android выберите Logcat.Как упоминал Джон, это очень полезно для отладки.

0 голосов
/ 28 декабря 2011

Вам просто нужен оператор @Override перед методом onClick:

открытый класс TimeEntryActivity расширяет Activity реализует OnClickListener {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);

    Button okButton = new Button(this);
    okButton.setText(":)");
    okButton.setOnClickListener(this);
    setContentView(okButton);

}

**@Override**

public void onClick(View v) {
    Log.d("TEST", "TEST");


}

}
0 голосов
/ 03 декабря 2011

Печать Android на консоли с System.out.println() не будет работать, потому что консоль встроена в телефон.

Вместо того, чтобы печатать на консоли, попробуйте вместо этого показать тост (его легче увидеть):

private OnClickListener btnListener = new OnClickListener() {
    public void onClick(View v) {
        Toast.makeText(this, "TEST", Toast.LENGTH_SHORT).show();
    }
};

Или, если вы действительно хотите печатать на консоль, вместо этого напечатайте в LogCat:

Log.d("HiThereActivity", "THIS IS DEBUG OUTPUT TO LOGCAT");

Обновление:

Возможно, попробуйте вызвать метод setDescendantFocusability для ваших переменных TableLayout и TableRow:

table.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
rowTitle.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
rowConditions.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

и в вашем итеративном цикле:

row.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
...