0

这是一个新手问题,但为什么我不能在 onCreate 方法之外的按钮上调用 setOnClickListener 方法?

例如为什么我不能这样做?或者,也许 Eclipse 只是在 onCreate 方法之外没有 setOnClickListener 代码提示?因为什么都没有出现。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
}


Button button = (Button) findViewById(R.id.button_send);
   button.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
      // Do something in response to button click
  }
});
4

7 回答 7

5

您可以在任何函数中设置点击侦听器。但这不是你的确切问题。实际问题是

setContentView(R.layout.main_layout);

您可以在setContentView之后调用findViewById函数。setContentView用于设置活动的布局。您的布局包含不同的视图,如按钮等。因此,如果您不设置布局,则无法使用 findViewById 访问视图,如果无法访问,则无法使用它们。

所以正确的顺序是:

1 Set layout on your activity using setContentView.
2 Find id for your view using findViewById.
3 Then use your views for your purposes.

始终首先关注基础知识。

另一个问题是您在任何函数之外调用 setOnClickListener 。在任何函数静态块之外,只允许函数声明和赋值。下面的声明都不是。所以它永远不会执行,回调也永远不会发生。

button.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
      // Do something in response to button click
  }

});

于 2013-03-12T07:06:44.610 回答
1

onCreate是普通 Java 中的main(String[] args)函数。这是您设置代码的地方。另请参阅此链接:-

关于“Hello World”Android教程的菜鸟问题

这是正确的方法:-

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
    Button button = (Button) findViewById(R.id.button_send);
button.setOnClickListener(new View.OnClickListener() {
 public void onClick(View v) {
  // Do something in response to button click
 }
});
}

或者

这是完成任务的另一种方法:-

    public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
    Button button = (Button) findViewById(R.id.button_send);
button.setOnClickListener(onClick);
}


public OnClickListener onClick= new OnClickListener() {

    @Override
    public void onClick(View v) {

        // Do something in response to button click
    }
};
于 2013-03-12T06:53:41.630 回答
0

为每个按钮注册 onClickListner。

button.setOnClickListener(this);

并覆盖此方法

@Override
public void onClick ( View v )
{
     if ( v == button ) 
     {
            // your code...
     }

   ////  add others...
}

在您的活动中实施 OnClickListener

public class yourActivity extends Activity implements OnClickListener
于 2013-03-12T07:02:20.047 回答
0

这个问题可以通过在 {} 中编写代码来解决:

public void onCreate(Bundle savedInstanceState)

以下:

setContentView(R.layout.main_layout);
于 2015-01-11T12:51:16.200 回答
0

例子

public class yourActivityName extends Activity implements OnClickListener {

    public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);
       setContentView(R.layout.main_layout);

       Button button = (Button) findViewById(R.id.button_send);
       button.setOnClickListener(this);

   }



    @Override

       public void onClick(View v) {

        if (v.getId() == R.id.button_send) {

            //your code..

        }
       }

}
于 2013-03-12T06:59:16.573 回答
0

只有在setContentView(R.layout.main_layout);调用之后,您才能访问该视图内的组件(即按钮)。因为按钮的声明和实例化是写在主类上下文中的,所以它发生setContentView.

在 onCreate 中插入按钮代码部分,它将起作用。

于 2013-03-12T06:54:11.287 回答
0

我认为这是因为您希望在代码执行后立即添加侦听器。如果你把它放在外面,这在技术上是非常可能的,你的代码将不会被执行(当然,除非你打算从 onCreate 方法中调用该方法。

于 2013-03-12T07:01:48.050 回答