我正在做一些android编程。我正在向视图添加按钮。每个按钮的onClick
函数都有其自己的行为。但是代码似乎是重复的。例如:
// the view
View v = new View(this);
// first button
Button b1 = new Button(this);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// some method body1
}
});
v.addView(b1);
// second button
Button b2 = new Button(this);
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// some method body2
}
});
v.addView(b2);
// nth button
// ...
是否有更简洁的方法向视图添加按钮,例如将方法主体传递给方法或其他方法?例如:
public void addButton(MethodBody methodBody)
{
Button b = new Button(this);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
methodBody
}
});
v.addView(b);
}
编辑:因此,在看到lambda的建议之后,是否可以像下面这样做某事,那里有一个通用方法,只是将body作为参数?
public void addButton(MethodBody methodBody)
{
Button b = new Button(this);
b.setOnClickListener(v ->
{
methodBody
}
);
v.addView(b);
}
编辑2:我想我们可以做到
// general method
public void addButton(OnClickListener onClickListener)
{
Button button = new Button(this);
// other stuff
button.setOnClickListener(onClickListener);
v.addView(button);
}
// run the method
addButton(v -> {
// some body
});
答案 0 :(得分:2)
使用 Java 8 Lamdas:
b1.setOnClickListener((View v) -> {
// // some method body1
});
b2.setOnClickListener((View v) -> {
// // some method body2
});
要在Android Studio中启用此功能,请在 build.gradle(应用程序)
中添加以下代码块compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
答案 1 :(得分:1)
您可以使用Java 8的method references。
void onCreate(){
//...
findViewById(R.id.btn1).setOnClickListener(this::handleBtn1Click);
findViewById(R.id.btn2).setOnClickListener(this::handleBtn2Click);
findViewById(R.id.btn3).setOnClickListener(this::handleBtn3Click);
}
void handleBtn1Click(View view){
// handle btn1 click here
}
void handleBtn2Click(View view){
// handle btn2 click here
}
void handleBtn3Click(View view){
// handle btn3 click here
}
答案 2 :(得分:0)
将OnClickListener实现作为参数传递,请参见Strategy Design Pattern