【发布时间】:2011-10-24 09:19:25
【问题描述】:
我在android中开始了一点程序, 我在一个活动中有 3 个按钮。
我看到了一些示例代码,它们将相同的OnClick 事件分配给所有按钮(即使它们执行完全不同的操作)并且在方法Switch(id) case case ...
什么是更好的方法?一个onClick方法和切换还是很多方法,每个按钮一个?
谢谢。
【问题讨论】:
标签: java android button onclick
我在android中开始了一点程序, 我在一个活动中有 3 个按钮。
我看到了一些示例代码,它们将相同的OnClick 事件分配给所有按钮(即使它们执行完全不同的操作)并且在方法Switch(id) case case ...
什么是更好的方法?一个onClick方法和切换还是很多方法,每个按钮一个?
谢谢。
【问题讨论】:
标签: java android button onclick
这样使用:
@Override
public void onCreate(Bundle savedInstanceState) {
button1.setOnClickListener(onClickListener);
button2.setOnClickListener(onClickListener);
button3.setOnClickListener(onClickListener);
}
private OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.button1:
//DO something
break;
case R.id.button2:
//DO something
break;
case R.id.button3:
//DO something
break;
}
}
};
【讨论】:
如果您想减少编码行数,请使用View's OnClick() with switch statement,如果您想单独处理所有点击(以便于理解和维护代码),请使用单独的所有button's onClick().
更新:
如果您在 Activity 布局 xml 文件中声明了按钮,则为所有按钮编写具有相同方法名称的属性 android:onClick="" 并在您的 Activity 中实现该方法。现在你有一个所有按钮的方法,并在该方法中区分具有 id 的按钮。
示例:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button android:id="@+id/button1"
android:layout_width="wrap_content"
android:onClick="buttonOnClick"
android:layout_height="wrap_content"
android:text="Hello, I am a Button 1" />
<Button android:id="@+id/button2"
android:layout_width="wrap_content"
android:onClick="buttonOnClick"
android:layout_height="wrap_content"
android:text="Hello, I am a Button 2" />
<Button android:id="@+id/button3"
android:layout_width="wrap_content"
android:onClick="buttonOnClick"
android:layout_height="wrap_content"
android:text="Hello, I am a Button 3" />
</LinearLayout>
现在在你的 Activity 中实现buttonOnClick like,
public void buttonOnClick(View view)
{
switch(view.getId())
{
case R.id.button1:
// Code for button 1 click
break;
case R.id.button2:
// Code for button 2 click
break;
case R.id.button3:
// Code for button 3 click
break;
}
}
或者您可以为活动中动态添加的按钮应用相同的开关盒,
就像你必须使用 implemented View 的 OnClickListerner's onClick 而不是 buttonOnClick。
【讨论】:
this.btnAddFriedtoFacebook = (Button) this.findViewById(R.id.btnAddFriedtoFacebook);
this.btnAddFriedtoFacebook.setOnClickListener(this.backButtonClickListener);
public OnClickListener backButtonClickListener = new OnClickListener()
{
public void onClick(final View view)
{
if (view == MatchInfoActivity.this.btnBack)
{
MatchInfoActivity.this.finish();
}
if( view == MatchInfoActivity.this.btnAddFried){
Intent i = new Intent(Intent.ACTION_VIEW);
MatchInfoActivity.this.startActivity(i);
}
if( view == MatchInfoActivity.this.btnAddBuddy){
Intent i = new Intent(Intent.ACTION_VIEW);
MatchInfoActivity.this.startActivity(i);
}
}
};
这是一个好方法。
【讨论】:
我认为在 xml(布局)中注册 onClick 是更好的方法。
编辑:
找到相关话题:
【讨论】:
在 XML 布局中注册 onClick 事件,然后在代码中处理。我会这样做:
<Button
android:id="@+id/btplus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me"
android:onClick="onBtnClicked">
.class 中的方法
public void onBtnClicked(View v) {
switch (v.getId()) {
case R.id.btplus:
Toast.makeText(getApplicationContext(), "Plus is clicked" + "+", Toast.LENGTH_SHORT).show();
break;
case R.id.btminu:
Toast.makeText(getApplicationContext(),"Minus is clicked" + "-", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
【讨论】:
@Nguyen 回答的一点补充。
findViewById(R.id.buttonOne).setOnClickListener(buttonClickListener);
.... .... .... ....
findViewById(R.id.buttonN).setOnClickListener(buttonClickListener);
private View.OnClickListener buttonClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.buttonOne:
// do something
break;
.... .... .... ....
case R.id.buttonN:
// do something
break;
}
}
};
如果您不想初始化按钮变量,但想跟踪按钮单击事件,这可能很有用。谢谢!
【讨论】: