Java代码优化-两个函数合一
你好,我有这个代码:Java代码优化-两个函数合一,java,android,Java,Android,你好,我有这个代码: this.firstBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { final CharSequence[] items = {"1", "2", "3"}; AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this);
this.firstBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
final CharSequence[] items = {"1", "2", "3"};
AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this);
builder.setTitle("test");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
langFrom.setText(items[item]);
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
this.secondBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
final CharSequence[] items = {"1", "2", "3"};
AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this);
builder.setTitle("test");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
langFrom.setText(items[item]);
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
只有两个不同的部分:this.firstBtn
和this.secondBtn
有没有办法合并它?例如,当我点击firstBtn
时,它会调用一个函数foo(firstBtn)
和secondBtn
调用foo(secondBtn)
,其余的函数也会这样做吗?
我对语法等不太清楚,因为我现在还不熟悉Java和Android开发
谢谢你想做的事情可以相对容易地完成。您可以定义一个实现
OnClickListener
的新类,并在两个位置使用该类的新实例
class MyOnClickListener implements OnClickListener {
public void onClick(View v) {
final CharSequence[] items = {"1", "2", "3"};
AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this);
builder.setTitle("test");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
langFrom.setText(items[item]);
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
然后,您的代码可以如下所示:
this.firstBtn.setOnClickListener(new MyOnClickListener());
this.secondBtn.setOnClickListener(new MyOnClickListener());
显然,如果您的两个MyOnClickListener
需要稍微不同,可以进一步采用此解决方案。这可以通过创建一个构造函数来实现,该构造函数接受要更改的参数并将其存储为成员变量,然后在调用onClick(…)
时使用这些变量:
然后可以这样使用:
final CharSequence[] items1 = {"1", "2", "3"};
final CharSequence[] items2 = {"2", "3", "4"};
this.firstBtn.setOnClickListener(new MyOnClickListener(items1));
this.secondBtn.setOnClickListener(new MyOnClickListener(items2));
更新
你想做的事情可以相对容易地完成。您可以定义一个实现
OnClickListener
的新类,并在两个位置使用该类的新实例
class MyOnClickListener implements OnClickListener {
public void onClick(View v) {
final CharSequence[] items = {"1", "2", "3"};
AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this);
builder.setTitle("test");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
langFrom.setText(items[item]);
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
然后,您的代码可以如下所示:
this.firstBtn.setOnClickListener(new MyOnClickListener());
this.secondBtn.setOnClickListener(new MyOnClickListener());
显然,如果您的两个MyOnClickListener
需要稍微不同,可以进一步采用此解决方案。这可以通过创建一个构造函数来实现,该构造函数接受要更改的参数并将其存储为成员变量,然后在调用onClick(…)
时使用这些变量:
然后可以这样使用:
final CharSequence[] items1 = {"1", "2", "3"};
final CharSequence[] items2 = {"2", "3", "4"};
this.firstBtn.setOnClickListener(new MyOnClickListener(items1));
this.secondBtn.setOnClickListener(new MyOnClickListener(items2));
更新
作为nicholas.hauschild回答的替代方案,如果您不想创建单独的类,只需让您的活动实现
View.OnClickListener
然后,将
onClick(视图v)
方法移动到按钮代码已经在的类中。如果您需要区分不同的按钮,那么只需执行开关(v.getId())
作为nicholas.hauschild答案的替代,如果您不想创建单独的类,只需让您的活动实现查看.OnClickListener
然后,将
onClick(视图v)
方法移动到按钮代码已经在的类中。如果您需要区分不同的按钮,那么只需切换(v.getId()),看起来不错。我通过添加扩展SlovnikoidActivity
修复了一个错误,但在代码的第四行还有一个错误,它表示在范围内无法访问SlovnikoidActivity类型的封闭实例。我不知道如何修复它,因为我不知道它意味着什么。感谢将这个类定义作为Activity类的一个子类(我认为它被称为SlovnikoidActivity
)。这样做将消除异常。创建子类是由扩展SlovnikoidActivity
创建的,对吗?它有助于消除一些错误,但仍然存在错误在范围中无法访问SlovnikoidActivity类型的封闭实例
对不起,我说的是子类,但我指的是内部类。我更新了我的答案以反映我的意思。看起来不错。我通过添加扩展SlovnikoidActivity
修复了一个错误,但在代码的第四行还有一个错误,它表示在范围内无法访问SlovnikoidActivity类型的封闭实例。我不知道如何修复它,因为我不知道它意味着什么。感谢将这个类定义作为Activity类的一个子类(我认为它被称为SlovnikoidActivity
)。这样做将消除异常。创建子类是由扩展SlovnikoidActivity
创建的,对吗?它有助于消除一些错误,但仍然存在错误在范围中无法访问SlovnikoidActivity类型的封闭实例
对不起,我说的是子类,但我指的是内部类。我已经更新了我的答案,以反映我的意思。谢谢。我已经编写了公共类SlovnikoidActivity extends Activity implements View.OnClickListener
,但是有一个错误类型SlovnikoidActivity必须实现继承的抽象方法View.OnClickListener.onClick(View)
。我试图将其更改为View.OnClickListener.onClick(View)
,但出现语法错误,无法通过hanks解决。我已经编写了公共类SlovnikoidActivity extends Activity implements View.OnClickListener
,但是有一个错误类型SlovnikoidActivity必须实现继承的抽象方法View.OnClickListener.onClick(View)
。我试图将其更改为View.OnClickListener.onClick(View)
,但出现语法错误,无法解决