我正在构建一个Android应用程序。我注意到我在每个类中创建了许多与此类似的重复代码:
Button buttonX = (Button)findViewById(R.id.buttonXName);
// Register the onClick listener with the implementation above
buttonX.setOnClickListener(new OnClickListener() {
public void onClick(View v)
{
//DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
}
});
我现在有十五个按钮,这使我的代码变得丑陋。有没有人有关于如何将所有这些代码转换为更有效的代码的类或一些示例,所以我可以:
{Button buttonX (Button)findViewById(R.id.buttonXName);}
{buttonX.setOnClickListener(new OnClickListener()}
{public void onClick(View v)}
如果有人知道,我会很感激。
答案 0 :(得分:49)
如果您的目标是1.6或更高版本,则可以使用android:onClick xml attribute删除部分重复代码。请参阅Romain Guy的this blog post。
<Button
android:height="wrap_content"
android:width="wrap_content"
android:onClick="myClickHandler" />
在Java类中,使用以下代码行:
class MyActivity extends Activity {
public void myClickHandler(View target) {
// Do stuff
}
}
答案 1 :(得分:26)
在您的活动上实施OnClickListener()...
public class MyActivity extends Activity implements View.OnClickListener {
}
对于每个按钮使用...
buttonX.setOnClickListener(this);
在Activity onClick()方法测试中,它是哪个按钮......
@Override
public void onClick(View view) {
if (View.equals(buttonX))
// Do something
}
同样在onClick中,您可以使用view.getId()获取资源ID,然后在开关/案例块中使用它来识别每个按钮并执行相关操作。
答案 2 :(得分:10)
public void registerButtons(){
register(R.id.buttonName1, ()-> {/*Your code goes here*/});
register(R.id.buttonName2, ()-> {/*Your code goes here*/});
register(R.id.buttonName3, ()-> {/*Your code goes here*/});
}
private void register(int buttonResourceId, Runnable r){
findViewById(buttonResourceId).setOnClickListener(v -> r.run());
}
public void registerButtons(){
register(R.id.buttonName1);
register(R.id.buttonName2);
register(R.id.buttonName3);
}
private void register(int buttonResourceId){
findViewById(buttonResourceId).setOnClickListener(buttonClickListener);
}
private OnClickListener buttonClickListener = new OnClickListener() {
@Override
public void onClick(View v){
switch (v.getId()) {
case R.id.buttonName1:
// TODO Auto-generated method stub
break;
case R.id.buttonName2:
// TODO Auto-generated method stub
break;
case View.NO_ID:
default:
// TODO Auto-generated method stub
break;
}
}
};
答案 3 :(得分:9)
由于在setOnClickListener
而不是View
上定义了Button
,如果您不需要其他内容的变量,那么您可以将它变成这样的一点点:
findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
}
});
答案 4 :(得分:6)
你可以使用数组来处理android中的几个按钮点击监听器,如下所示: 在这里,我使用数组作为按钮单击n个按钮的监听器:
Button btn[] = new Button[n];
注意:n是常数正整数
代码示例:
//class androidMultipleButtonActions
package a.b.c.app;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class androidMultipleButtonActions extends Activity implements OnClickListener{
Button btn[] = new Button[3];
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn[0] = (Button) findViewById(R.id.Button1);
btn[1] = (Button) findViewById(R.id.Button2);
btn[2] = (Button) findViewById(R.id.Button3);
for(int i=0; i<3; i++){
btn[i].setOnClickListener(this);
}
}
public void onClick(View v) {
if(v == findViewById(R.id.Button1)){
//do here what u wanna do.
}
else if(v == findViewById(R.id.Button2)){
//do here what u wanna do.
}
else if(v == findViewById(R.id.Button3)){
//do here what u wanna do.
}
}
}
注意:首先编写一个main.xml文件,如果你不知道怎么写请发邮件到: wesagnd@yahoo.com
答案 5 :(得分:3)
我认为你通常可以在循环中做你需要的东西,如果可以的话,这比许多onClick
方法要好得多。
查看this answer,了解如何针对类似问题使用循环。如何构建循环将取决于onClick
函数的需求以及它们彼此之间的相似程度。最终结果是重复性更低的代码更容易维护。
答案 6 :(得分:1)
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Button is Working",Toast.LENGTH_LONG).show();
}
}
答案 7 :(得分:1)
使用View.OnClickListener
实施活动,如下所示。
public class MyActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_options);
Button button = findViewById(R.id.button);
Button button2 = findViewById(R.id.button2);
button.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.button:
// Write your code here first button
break;
case R.id.button2:
// Write your code here for second button
break;
}
}
}
答案 8 :(得分:1)
public class MyActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_options);
Button button = findViewById(R.id.button);
Button button2 = findViewById(R.id.button2);
button.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.button:
// Write your code here first button
break;
case R.id.button2:
// Write your code here for second button
break;
}
}
}