我目前正在Android上制作一个简单的计算器应用程序。我试图设置代码,以便当按下数字按钮时,它会用该数字更新计算器屏幕。目前我这样做。
Button one = (Button) findViewById(R.id.oneButton);
one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView output = (TextView) findViewById(R.id.output);
output.append("1");
}
});
它可以工作,但我正在为计算器上的每个按钮编写相同的代码。你可以想象它是多余的。无论如何我能以更有效的方式编写这段代码吗?一个涉及不为每个按钮编写此方法的人?
您只需按照以下步骤轻松实现......
您不必为每个onClickListener
编写新的Button
...只需将View.OnClickLister
实施到您的Activity
/ Fragment
..它将实现名为onClick()
的新方法,用于处理Button
,TextView`等的onClick事件。
- 在
OnClickListener()
/Activity
中实施Fragment
public class MainActivity extends Activity implements View.OnClickListener {
}
- 在Activity / Fragment中实现onClick()方法
public class MainActivity extends Activity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onClick(View v) {
// default method for handling onClick Events..
}
}
- 为按钮实施
OnClickListener()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
Button one = (Button) findViewById(R.id.oneButton);
one.setOnClickListener(this); // calling onClick() method
Button two = (Button) findViewById(R.id.twoButton);
two.setOnClickListener(this);
Button three = (Button) findViewById(R.id.threeButton);
three.setOnClickListener(this);
}
- 按ID查找按钮并实施您的代码..
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.oneButton:
// do your code
break;
case R.id.twoButton:
// do your code
break;
case R.id.threeButton:
// do your code
break;
default:
break;
}
}
有关更多信息,请参阅此链接:
https://androidacademic.blogspot.in/2016/12/multiple-buttons-onclicklistener-android.html
这样可以更轻松地处理许多按钮点击事件,并使管理它看起来很简单......
我发现使用长if / else链(或开关),除了findViewById(btn).setOnClickListener(this)
列表是丑陋的。如何使用覆盖创建新的View.OnlickListeners,内联:
findViewById(R.id.signInButton).setOnClickListener(new View.OnClickListener()
{ @Override public void onClick(View v) { signIn(); }});
findViewById(R.id.signOutButton).setOnClickListener(new View.OnClickListener()
{ @Override public void onClick(View v) { signOut(); }});
findViewById(R.id.keyTestButton).setOnClickListener(new View.OnClickListener()
{ @Override public void onClick(View v) { decryptThisTest(); }});
findViewById(R.id.getBkTicksButton).setOnClickListener(new View.OnClickListener()
{ @Override public void onClick(View v) { getBookTickers(); }});
findViewById(R.id.getBalsButton).setOnClickListener(new View.OnClickListener()
{ @Override public void onClick(View v) { getBalances(); }});
你可以设置属性:
android:onClick="buttonClicked"
在每个按钮的xml文件中,并在java代码中使用它:
public void buttonClicked(View view) {
if (view.getId() == R.id.button1) {
// button1 action
} else if (view.getId() == R.id.button2) {
//button2 action
} else if (view.getId() == R.id.button3) {
//button3 action
}
}
我创建了实现View.OnClickListener的专用类。
public class ButtonClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show();
}
}
然后,我在MainActivity中创建了这个类的实例
private ButtonClickListener onClickBtnListener = new ButtonClickListener();
然后设置onClickListener为按钮
btn.setOnClickListener(onClickBtnListener);
在每个按钮上设置一个标签,以便您可以使用它,在这种情况下可能是整数。然后,您只需要一个OnClickListener用于所有按钮:
Button one = (Button) findViewById(R.id.oneButton);
Button two = (Button) findViewById(R.id.twoButton);
one.setTag(new Integer(1));
two.setTag(new Integer(2));
OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView output = (TextView) findViewById(R.id.output);
output.append(v.getTag());
}
}
one.setOnClickListener(onClickListener);
two.setOnClickListener(onClickListener);
public class MainActivity extends AppCompatActivity implements OnClickListener {
Button b1,b2;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1= (Button) findViewById(R.id.button);
b2= (Button) findViewById(R.id.button2);
b1.setOnClickListener(this);
b2.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
if(v.getId()==R.id.button)
{
Intent intent=new Intent(getApplicationContext(),SignIn.class);
startActivity(intent);
}
else if (v.getId()==R.id.button2)
{
Intent in=new Intent(getApplicationContext(),SignUpactivity.class);
startActivity(in);
}
}
}
我有一个类似的问题,我做的是:创建一个按钮数组
Button buttons[] = new Button[10];
然后在click侦听器和引用xml id上实现我使用了这样的循环
for (int i = 0; i < 10; i++) {
String buttonID = "button" + i;
int resID = getResources().getIdentifier(buttonID, "id",
"your package name here");
buttons[i] = (Button) findViewById(resID);
buttons[i].setOnClickListener(this);
}
但是调用它们仍然与Prag的答案点4相同.PS-如果有人有更好的方法来调用onClick上的所有按钮,请进行评论。
public void onClick(View v) {
int id = v.getId();
switch (id){
case R.id.button1:
//do ur code
Toast.makeText(this,"This is button 1",Toast.LENGTH_SHORT).show();
break;
case R.id.button2:
Intent intent = new Intent(this,SecondActivity.class);
Intent.putExtra("key",value);
startActivity(intent);
break;
case R.id.button3:
//do ur code
break;
case R.id.button4:
//do ur code;
break;
default:
//do ur code;
}
}
在Activity / Fragment公共类中实现onClick()方法MainActivity extends Activity实现View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onClick(View v) {
switch(itemId){
//如果您使用导航栏调用片段然后使用。
case R.id.nav_menu1:
fragment = new IntroductionFragment();
break;
//如果使用带导航栏的呼叫活动
case R.id.nav_menu6:
Intent i = new Intent(MainActivity.this, YoutubeActivity.class);
startActivity(i);
// default method for handling onClick Events..
}
}
你可以用它
TextView output = (TextView) findViewById(R.id.output);
one.setOnClickListener(youractivity.this);
// set the onclicklistener for other buttons also
@Override
public void onClick(View v) {
int id = v.getId();
switch(id) {
case R.id.oneButton:
append("1",output);
break;
case R.id.twoButton:
append("2",output);
break;
case R.id.threeButton:
append("3",output);
break;
}
}
private void append(String s,TextView t){
t.setText(s);
}
您可以使用单独的方法识别活动中的视图。