繁体   English   中英

将回调作为参数传递给 Android 中的抽象 setOnClickListener

[英]Pass a callback as a parameter to abstract setOnClickListener in Android

 public interface Callback {
    void execute(Button button);
}

protected void addClickListener(final Button button, final Callback callback) {
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            callback.execute(button);
        }
    });
}

protected Callback numberActions(Button button) {
    String value = button.getText().toString();
    setDisplay(value);
}

protected void setDisplay (String value) {
        String newValue;
        displayValue = resultDisplay.getText().toString();
        if (displayValue.length() < 10){
            newValue = resultDisplay.getText() + value;
            resultDisplay.setText(newValue);
            displayValue = newValue;
        }
};

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

        Button numberButtons[] = new Button[11];
        numberButtons[0] = (Button) findViewById(R.id.numberOne);
        numberButtons[1] = (Button) findViewById(R.id.numberTwo);
        numberButtons[2] = (Button) findViewById(R.id.numberTwo);
        numberButtons[3] = (Button) findViewById(R.id.numberThree);
        numberButtons[4] = (Button) findViewById(R.id.numberFour);
        numberButtons[5] = (Button) findViewById(R.id.numberFive);
        numberButtons[6] = (Button) findViewById(R.id.numberSix);
        numberButtons[7] = (Button) findViewById(R.id.numberSeven);
        numberButtons[8] = (Button) findViewById(R.id.numberEight);
        numberButtons[9] = (Button) findViewById(R.id.numberNine);
        numberButtons[10] = (Button) findViewById(R.id.numberZero);

        resultDisplay = (TextView) findViewById(R.id.resultDisplay);

        for (Button button: numberButtons) {
            addClickListener(button, numberActions(button));
        }
}

我正在使用 Java 在 Android Studio 上构建一个简单的计算器。

我没有对按钮的每个实例调用 setOnClickListener,而是创建了 addClickListiner 来抽象它。 例如,我创建了一个数字按钮数组,并在onClick function 上定义它们应该将输入显示更改为操作。 我的目标是对每个按钮使用 addClickListener,然后我可以将一个动作作为第二个参数(回调)传递,该参数将定义该按钮将执行的动作。

实际上我是一个 javascript 开发人员,这就像传递一个 function 作为参数一样简单。 当我正在学习 Java 时,我不知道如何执行它...我的目标是传递一个 void function 作为参数,以便在单击按钮时执行它。

我试图创建一个公共接口......但是当我尝试构建它时,它打破说我应该在 numberActions 方法上有一个 return 语句。 谁能帮我解决如何在这种情况下将回调 function 作为参数传递?

你可以试试这个

for (Button button : numberButtons) {
       button.setOnClickListener = this;
}

实现View.OnClickListener接口。 然后在您的活动/片段中

@Override
public void onClick(View v) {

    Button button= (Button) v

    switch(v.getId()){

    case R.id.numberOne:
       String value = button.getText().toString();
       setDisplay(value);
       break;
    }
}

我的目标是传递一个 void function 作为参数,以便在单击按钮时执行它

您可以通过使用Consumer<Button>作为回调来实现这一点。 如果您有一些操作按钮(例如“+”、“-”)以及带有数字的按钮,那么您的方法numberActions()可以像这样工作:

private Consumer<Button> add = new Consumer<Button>() {
    @Override
    public void accept(Button button) {
        Toast.makeText(MainActivity.this, "'Add' not yet implemented", Toast.LENGTH_SHORT).show();
    }
};

private Consumer<Button> subtract = new Consumer<Button>() {
    @Override
    public void accept(Button button) {
        Toast.makeText(MainActivity.this, "'Subtract' not yet implemented", Toast.LENGTH_SHORT).show();
    }
};

protected Consumer<Button> numberActions(Button button) {
    final String value = button.getText().toString();
    switch (value){
        case "+":
            return add;
        case "-":
            return subtract;
        default: // must be a digit
            return new Consumer<Button>(){
                @Override
                public void accept(Button button) {
                    setDisplay(value);
                }
            };
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM