首页 > 解决方案 > 将回调作为参数传递给 Android 中的抽象 setOnClickListener

问题描述

 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函数上定义它们应该将输入显示更改为操作。我的目标是对每个按钮使用 addClickListener,然后我可以将操作作为第二个参数(回调)传递,该参数将定义该按钮将执行的操作。

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

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

标签: javaandroidonclicklistener

解决方案


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

您可以通过使用Consumer<Button>as 回调来实现此目的。如果您有一些操作按钮(例如“+”、“-”)以及带有数字的按钮,那么您的方法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);
                }
            };
    }
}

推荐阅读