java - 将回调作为参数传递给 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 语句。谁能帮助我在这种情况下如何将回调函数作为参数传递?
解决方案
我的目标是传递一个 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);
}
};
}
}
推荐阅读
- python - 在单个 ascii 文件中每隔 N 组数据添加一个空行
- javascript - Chart.JS 中的固定时间范围
- ksqldb - KSQL Group By 删除以前的值并仅使用 LAST
- python - Django Rest Framework - 在 python 客户端中反序列化响应时重用模型逻辑
- reactjs - 使 history.push 在 React app.tsx 中可用
- sql - 为什么datatable会改变日期的格式
- python - 在 python 中删除目录几乎总是会导致文件夹“锁定”并且由于权限错误而无法删除
- reflection - 如何在 Mvx.IoCProvider.Register 中提供类似 OnActivate(在 Autofac 中)的功能
- c# - 将 TempData 传递给 ActionFilter RedirectToAction
- elasticsearch - 在不同字段中按空格分隔的查询字符串搜索