Передайте обратный вызов в качестве параметра для абстрактного setOnClickListener в Android - PullRequest
0 голосов
/ 05 апреля 2020
 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));
        }
}

Я строю простой калькулятор на Android Studio с Java.

Вместо вызова setOnClickListener для каждого экземпляра кнопки, я создал addClickListiner для его абстрагирования. Так, например, я создаю массив кнопок с цифрами, и с помощью функции onClick я определяю, что они должны изменить отображение ввода как действие. Моя цель - использовать addClickListener для каждой кнопки, затем я могу передать действие в качестве второго параметра (обратного вызова), который определит, какое действие будет выполнять эта кнопка.

На самом деле я javascript разработчик, и это было бы так же просто, как просто передать функцию в качестве параметра. Поскольку я изучаю Java, я не знаю, как это выполнить ... Моя цель - передать функцию void в качестве параметра для ее выполнения при каждом нажатии кнопки.

Я пытался создать интерфейс publi c ... Но когда я пытаюсь его построить, он ломается, говоря, что у меня должен быть оператор return для метода numberActions. Может кто-нибудь помочь мне с тем, как передать функцию обратного вызова в качестве параметров в этом случае?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Моя цель - передать функцию void в качестве параметра для ее выполнения при каждом нажатии кнопки

Этого можно добиться с помощью 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);
                }
            };
    }
}
0 голосов
/ 05 апреля 2020

Вы можете попробовать это

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;
    }
}
...