0

我在 C 方面有很好的背景,现在我正在为 android/java 编写代码。我不明白为什么处理函数的函数定义是在另一个函数内部完成的。代码变得如此混乱且难以维护和理解(来自 C 程序员 POV)。

所以我有这个代码

    final Button btnOpenPopup = (Button)findViewById(R.id.menuButton);
btnOpenPopup.setOnClickListener(new 
            Button.OnClickListener()
    {...}

是否可以 myButtonClickListner() {}在类中定义一个函数和btnOpenPopup.setOnClickListener((SomeCast)myButtonClickListner

我认为必须有一种方法,但我无法找到它..

请评论。

4

5 回答 5

1

好吧,有两种方法可以做到这一点:

1- 让包含类实现 OnClickListener 接口。例如:

public class MainActivity extends Activity implements OnClickListener{
    //...

    public void onCreate(Bundle savedState){
        //...
        final Button btnOpenPopup = (Button)findViewById(R.id.menuButton);
        btnOpenPopup.setOnClickListener(this);
    }

    public void onClick(View v){
        switch(v.getId()){
            case R.id.button1:
            //
            break;
        }
    }

2- 第二种方法是 Selvin 在他的评论中描述的方法:创建一个单独的类,它实现 OnClickListener 接口,并在您的 onCreate() 中实例化它。因此,假设您在自己的 myButtonListener.java 文件中有一个 myButtonListener 类,您可以简单地执行以下操作:

final Button btnOpenPopup = (Button)findViewById(R.id.menuButton);
btnOpenPopup.setOnClickListener(new myButtonListener);
于 2013-06-07T10:58:23.997 回答
0

-你所遇到的是知道的Anonymous Inner Class

匿名内部类:

  • 没有名字。
  • 它必须分别实现或扩展一个且仅一个接口或类。

-这只是一种编码方式,您可以在其中保持该视图或组件的功能在视觉上附加。

您可以这样做的另一种方法是执行以下操作:

-实现具有回调方法的特定接口。

public class MainActivity implements OnItemClickListener{

  private Button buttonClick;
  ....
  ....

  onCreate(Bundle saveInstance){

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


  buttonClick = (Button)findViewById(R.id.button_click);

  buttonClick.setOnClickListener(this);

  ...
  ...

 }


       @Override
    public void onClick(View v) {

        switch (v.getId()) {


        case R.id.button_click:

             // -------- Do you function here

                break;

             }
        }

}
于 2013-06-07T11:10:05.450 回答
0

在您的类上实现View.OnClickListener并覆盖其onClick方法。这将使代码更加简洁。

但首先我建议您对 OOP 和 Java 有适当的了解。

于 2013-06-07T10:54:54.493 回答
0

您只需要实现 OnClickListener 接口并覆盖 onCLick 方法。在您的 onCLick() 方法上,您只需要为相应的视图添加一个过滤器。

public void onClick(View arg0){
     if(arg0 == myButton){
            //do stuff when myButton is click
      }else if(arg0 == myOtherButton){
           //do stuff when myOtherButton is click
      }

  }
于 2013-06-07T11:00:26.883 回答
0

使用背后的想法

final Button btnOpenPopup = (Button)findViewById(R.id.menuButton);
btnOpenPopup.setOnClickListener(new 
            Button.OnClickListener()
    {...}

这种编码风格是对象及其实现集中在一个地方。在上面的代码中,我们使用了匿名内部类。

如果您对这样的实现不满意,那么还有另一种方法可以做到这一点。

在您的活动中,实现 onClickListener,如下所示:

public class MainActivity extends Activity implements OnClickListener{

Button btnOk;

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

    //find id of your button
    btnOk = (Button) findViewById(R.id.btnOk);

    //Registering it for click listener
    btnOk.setOnClickListener(this);

}

@Override
public void onClick(View v) {

    switch (v.getId()) {
    case R.id.btnOk:

        System.out.println("OK button is clicked");

        break;

    case 2:
        //some other controls

        break; 

    default:
        break;
    }

}

}

于 2013-06-07T11:04:04.523 回答