有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java订阅按钮单击,无需内联实现

public void onCreate(Bundle savedInstanceState) {
    ...
    btn_client_connect.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            // inline implementation goes here ...
        }
}

我想将内联实现移动到单独的函数,保持onCreate函数简短易读:

    private void OnBtnConnectClick(View v) {
        // implementation...
    }

现在,我需要使用如下方式订阅按钮单击:

btn_client_connect.setOnClickListener(this.OnBtnConnectClick);

但这并没有经过编译。我只有一个丑陋的解决方案:

btn_client_connect.setOnClickListener(new Button.OnClickListener() 
{
    public void onClick(View v) 
    {
        OnBtnConnectClick(v);
    }
});

有没有更好的办法


共 (6) 个答案

  1. # 1 楼答案

    方法在Java中不是对象,所以不能这样做

    您可以创建一个私有的内部类(或者一个单独的类,由您决定):

    private class MyListener implements OnClickListener {
        public void onClick(View v) 
        {
            OnBtnConnectClick(v);
        }
    }
    

    然后呢

    this.onBtnConnectClick = new MyListener();
    btn_client_connect.setOnClickListener(this.onBtnConnectClick);
    
  2. # 2 楼答案

    如果用XML创建布局,那么可以使用Buttonandroid:onClick属性。您需要定义方法的名称:

    android:onClick="onClick"
    

    并在Activity中实现此方法:

    public void onClick(View v) {
      switch(v.getId()) {
        ...
      }
    }
    

    不需要额外的代码。希望这有帮助

  3. # 3 楼答案

    还有其他方法可以设置Click Listeners与之类似

    您只需键入xml

    android:onClick="OnBtnConnectClick"

    Keppil建议的其他

    myButton.setOnClickListener(new myClickListener());
    
    public class myClickListener implements OnClickListener {
    
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
    
        }
    
    }
    
  4. # 4 楼答案

    有几种方法可以做到这一点:

    btn_client_connect.setOnClickListener(getButtonListener());
    

    然后这个方法看起来像:

    public OnClickListener getButtonListener(){
        return new OnClickListener() {
            public void onClick(View v) {
                // inline implementation goes here ...
                OnBtnConnectClick(v);
            }
    }
    

    或者另一种方法:

    btn_client_connect.setOnClickListener(new SomeButtonListener());
    

    然后这个类看起来像:

    public (or private) class SomeButtonListener implements OnClickListener {
         public void onClick(View v) {
                // inline implementation goes here ...
                OnBtnConnectClick(v);
            }
    }
    
  5. # 6 楼答案

    protected void onCreate(Bundle bundle){
       btn = findview....
       btn.setOnClickListener(buttonClcikListener);
    }
    
    
    
    private View.OnClickListener buttonClcikListener = new View.OnClickListener() {
    
        @Override
        public void onClick(View v) {
            // your code here 
        }
    };