[英]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.