error: /home/retok/proj/src/com/hellow/app/HelloActivity.java:34: ';' expected

error: /home/retok/proj/src/com/hellow/app/HelloActivity.java:34: ';' expected

我试图让 Android onClick() 方法更容易阅读,所以我把它包装成这样

public void click(Button bt) {
    bt.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {}
    });
}

当我尝试 运行 这样的时候

button = (Button) findViewById(R.id.btn1);

click(button) {
    @Override
    public void onClick(View v) {
        Log.v("hi", "test");

    }
}

button = (Button) findViewById(R.id.btn1);

click(button) {
    @Override
    public void onClick(View v) {
        Log.v("hi", "test");

    }
};

button = (Button) findViewById(R.id.btn1);

click(button) {
    @Override
    public void onClick(View v) {
        Log.v("hi", "test");

    };
};

它给出了以下错误:

[error] /home/retok/proj/src/com/hellow/app/HelloActivity.java:32: ';' expected
[error] /home/retok/proj/src/com/hellow/app/HelloActivity.java:34: ';' expected
[error] /home/retok/proj/src/com/hellow/app/HelloActivity.java:34: ';' expected
[error] (compile:compileIncremental) javac returned nonzero exit code

这是为什么?如您所见,我在需要的地方放了 ; 。而且我不能将 ; 放在 public void onClick(View v) {click(button) { 之后,因为那样会关闭该方法并无论如何都会出错。

使用这个:

click(button) {
    @Override
    public void onClick((View v) {
        Log.v("hi", "test");

    }
});

你这里有错误:

click(button) {
    @Override

click(button)被视为方法调用,当时忽略该行的其余部分,但该调用缺少 ;.

您似乎试图覆盖由 new View.OnClickListener() 创建的匿名 class 的方法部分,但这是不可能的/不允许的。

我的理解是您希望为多个按钮设置一个按钮处理程序。这个确实可以,只是你没有正确的做法。

来自 this question, this non-selected answer 展示了如何在一个位置处理多个按钮:

@Override
public void onCreate(Bundle savedInstanceState) {
        button1.setOnClickListener(onClickListener);
        button2.setOnClickListener(onClickListener);
        button3.setOnClickListener(onClickListener);
}

private OnClickListener onClickListener = new OnClickListener() {
     @Override
     public void onClick(final View v) {
         switch(v.getId()){
             case R.id.button1:
                  //DO something
             break;
             case R.id.button2:
                  //DO something
             break;
             case R.id.button3:
                  //DO something
             break;
         }

   }
};

(如果您真的想以相同的方式处理任何按钮,则不需要 switch,这似乎不太可能)。