Android:为什么我不能在onCreate方法之外的按钮上调用setOnClickListener方法?

时间:2013-03-12 06:48:13

标签: java android

这是一个新手问题,但为什么我不能在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
  }
});

7 个答案:

答案 0 :(得分:4)

您可以在任何功能中使用setonclicklistener。但这不是你的确切问题。 实际问题是

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
  }

});

答案 1 :(得分:1)

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

Noob question about "Hello World" Android tutorial

这是正确的方法: -

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
    }
};

答案 2 :(得分:0)

只有在调用setContentView(R.layout.main_layout);之后,您才能访问该视图中的组件(即按钮)。 由于按钮的声明和即时创建在主类上下文中,因此发生在<{strong> setContentView之前。

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

答案 3 :(得分: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..

        }
       }

}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

为每个按钮注册onClickListener,如。

button.setOnClickListener(this);

并覆盖此方法

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

   ////  add others...
}

在您的活动中实施OnClickListener

public class yourActivity extends Activity implements OnClickListener

答案 6 :(得分:0)

在{} of:

中编写代码可以修复此问题
public void onCreate(Bundle savedInstanceState)

下方:

setContentView(R.layout.main_layout);