2011-12-02 40 views
0

我是Android新手,并且无法获取此表中的按钮来触发OnClick事件。我们的目标是要有一个充满按钮的表格,当他们被点击时,做一些事情。现在,我只想输出到控制台,但不会调用OnClick方法。按钮OnClick不在Android上发射

我相信这是一个愚蠢的问题,并感谢帮助。

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"); 


} 

} 
+0

检查logcat中,改变了我的答案.... – Mateusz

回答

0

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); 
+0

Darnit。我感觉很蠢。我尝试了Toast和Log,并且放入了断点,并且OnCLick永远不会被调用。我想知道该表是否以某种方式拦截事件。 –

+0

@MichaelBordelon检查我的更新后的帖子是否有新的建议。 –

+0

谢谢你的帮助约翰。我检查了LogCat,没有任何记录。另外,当我进入调试阶段时,它无法使用OnClick方法。我也尝试了Focusability设置。这是一个好主意。我做了很多iOS开发,从来没有遇到过这样的事情。看起来好像在表格行中有按钮是不奇怪的。 –

0

如果您使用的是Eclipse去窗口 - >显示视图>其他...并在Android的组中选择logcat的。正如约翰所说,它对调试非常有用。

+0

感谢Sanandrea。我能够看到Logcat并进行了测试,以确保它获取我的日志消息,但onclick方法未被调用。 –

+0

你看到按钮了吗? – Sanandrea

0

你只需要一个@Override声明的onClick方法之前:

公共类TimeEntryActivity扩展活动工具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"); 


} 

}