Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java代码优化-两个函数合一_Java_Android - Fatal编程技术网

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)
,但出现语法错误,无法解决