Android:对超过 1 个按钮使用带有 setOnClickListener/onClick 的 SWITCH 语句?
Posted
技术标签:
【中文标题】Android:对超过 1 个按钮使用带有 setOnClickListener/onClick 的 SWITCH 语句?【英文标题】:Android: Use a SWITCH statement with setOnClickListener/onClick for more than 1 button? 【发布时间】:2010-12-03 00:20:24 【问题描述】:假设我在 LinearLayout 中有几个按钮,其中 2 个是:
mycards_button = ((Button)this.findViewById(R.id.Button_MyCards));
exit_button = ((Button)this.findViewById(R.id.Button_Exit));
我在他们两个上都注册了setOnClickListener()
:
mycards_button.setOnClickListener(this);
exit_button.setOnClickListener(this);
如何制作 SWITCH 以区分 Onclick 中的两个按钮?
public void onClick(View v)
switch(?????)
case ???:
/** Start a new Activity MyCards.java */
Intent intent = new Intent(this, MyCards.class);
this.startActivity(intent);
break;
case ???:
/** AlerDialog when click on Exit */
MyAlertDialog();
break;
【问题讨论】:
我不喜欢为此使用菜单,因为我可以将按钮放在布局上我想要的任何位置...... 【参考方案1】:用途:
public void onClick(View v)
switch(v.getId())
case R.id.Button_MyCards: /** Start a new Activity MyCards.java */
Intent intent = new Intent(this, MyCards.class);
this.startActivity(intent);
break;
case R.id.Button_Exit: /** AlerDialog when click on Exit */
MyAlertDialog();
break;
请注意,这不适用于 android 库项目(由于 http://tools.android.com/tips/non-constant-fields),您需要使用以下内容:
int id = view.getId();
if (id == R.id.Button_MyCards)
action1();
else if (id == R.id.Button_Exit)
action2();
【讨论】:
效果很好!我想知道我自己怎么没有试过这个!非常感谢伙计。 H. 当我这样做时,eclipse 告诉我:“case 表达式必须是常量表达式” @dell116 它告诉您,因为您在 case 中使用的变量不是常量。将它抱怨的变量声明为 final,例如“final int x = 5;
”,或者在 switch 之前声明一个变量 y“final int y = x;
”,如果在到达 case 之前必须修改 x。
您不能在 switch-case 中使用 R.id.*,因为它们不是 final
变量。
@MasterGaurav 你可以使用 R.id.*,除非它是一个 Android 库项目:tools.android.com/tips/non-constant-fields。我将在答案中添加注释以解决此问题。【参考方案2】:
另一种选择是在 setOnClickListener() 中添加一个新的 OnClickListener 作为参数并覆盖 onClick() 方法:
mycards_button = ((Button)this.findViewById(R.id.Button_MyCards));
exit_button = ((Button)this.findViewById(R.id.Button_Exit));
// Add onClickListener to mycards_button
mycards_button.setOnClickListener(new OnClickListener()
public void onClick(View view)
// Start new activity
Intent intent = new Intent(this, MyCards.class);
this.startActivity(intent);
);
// Add onClickListener to exit_button
exit_button.setOnClickListener(new OnClickListener()
public void onClick(View view)
// Display alertDialog
MyAlertDialog();
);
【讨论】:
我一直觉得确实很乱 我喜欢它,但我想这几乎是个人喜好问题。 不,不要使用它。因为任何时候你使用 setOnclickListener(new OnclickLisener()...); Android 创建一个新线程来捕捉动作。所以想象一下,如果你有 10 个按钮,你有 10 个线程,那就不好了。 @Cocorico Android 不会为每个 OnClickLister 创建线程。 @cyronix。严重地 ?我的安卓老师是这么说的。但是,你说得对吗,这种方法不优雅?【参考方案3】:还有第三种选择。在您的 onCreate() 方法中,找到您拥有的所有按钮视图并将它们保存为类数据成员。然后,您可以级联一组 if-else 语句以找出哪个是哪个。这有点乱,但如果您不知道按钮的 ID,这是必须的(如果您在 java 代码中生成按钮,这可能会很复杂)。
@Override
public void onClick(View v)
if (v == m_myCards)
Intent intent = new Intent(this, MyCards.class);
this.startActivity(intent);
else if (v == m_exit)
MyAlertDialog();
else if (v == m_back)
finish();
这项技术的另一个优点是它灵活且快速(无需解析 ID)。坏事是您需要将小部件保存在内存中。
不知道哪种方法更好。
【讨论】:
用 switch 语句也可以吗? @winklerrr - 不,java 中的 switch 语句需要常量,而不是变量。这就是为什么这个例子使用了不太优雅的 if-else 语句系列。 如果你这样声明方法会怎样:onClick(final View v)
?
@winklerrr - 不错的尝试!编译器仍然认为v
是一个变量,会像个老人一样抱怨。有些语言允许使用变量,但 java 不允许。一种常见的解决方法是使用视图的 ID。有关示例,请参阅 ayushnvijay 或 Droidvilla 的答案。【参考方案4】:
在 OnCreate 方法中:-
Button b = (Button)findViewById(R.id.button1);
b.setOnClickListener((View.OnClickListener)this);
b = (Button)findViewById(R.id.button2);
b.setOnClickListener((View.OnClickListener)this);
@Override
public void OnClick(View v)
switch(v.getId())
case R.id.button1:
//whatever
break;
case R.id.button2:
//whatever
break;
【讨论】:
如果您的活动实现了OnClickListener
接口,则无需将其转换为OnClickListener
。【参考方案5】:
public class MainActivity extends Activity
implements View.OnClickListener
private Button btnForward, btnBackword, btnPause, btnPlay;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initControl();
private void initControl()
btnForward = (Button) findViewById(R.id.btnForward);
btnBackword = (Button) findViewById(R.id.btnBackword);
btnPause = (Button) findViewById(R.id.btnPause);
btnPlay = (Button) findViewById(R.id.btnPlay);
btnForward.setOnClickListener(this);
btnBackword.setOnClickListener(this);
btnPause.setOnClickListener(this);
btnPlay.setOnClickListener(this);
@Override
public void onClick(View v)
switch (v.getId())
case R.id.btnForward:
break;
case R.id.btnBackword:
break;
case R.id.btnPause:
break;
case R.id.btnPlay:
break;
【讨论】:
【参考方案6】:我把它简单化了,如果布局相同我只是把它的意图。
我的代码是这样的:
public class RegistrationMenuActivity extends AppCompatActivity implements View.OnClickListener
private Button btnCertificate, btnSeminarKit;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registration_menu);
initClick();
private void initClick()
btnCertificate = (Button) findViewById(R.id.btn_Certificate);
btnCertificate.setOnClickListener(this);
btnSeminarKit = (Button) findViewById(R.id.btn_SeminarKit);
btnSeminarKit.setOnClickListener(this);
@Override
public void onClick(View view)
switch (view.getId())
case R.id.btn_Certificate:
break;
case R.id.btn_SeminarKit:
break;
Intent intent = new Intent(RegistrationMenuActivity.this, ScanQRCodeActivity.class);
startActivity(intent);
【讨论】:
【参考方案7】:对于我的例子:首先'MainActivity'实现'View.OnClickListener'而不是开始代码......
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
public void init()
foryou = (Button) this.findViewById(R.id.btn_foryou);
following = (Button) findViewById(R.id.btn_following);
popular = (Button) findViewById(R.id.btn_popular);
watching = (Button) findViewById(R.id.btn_continuewatching);
mProgress = (ProgressBar) findViewById(R.id.pb);
foryou.setOnClickListener(this);
following.setOnClickListener(this);
popular.setOnClickListener(this);
watching.setOnClickListener(this);
mProgress.setOnClickListener(this);
public void onClick(View v)
switch (v.getId())
case R.id.btn_foryou:
foryou.setPaintFlags(foryou.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
break;
case R.id.btn_following:
following.setPaintFlags(following.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
break;
case R.id.btn_popular:
popular.setPaintFlags(popular.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
break;
case R.id.btn_continuewatching:
watching.setPaintFlags(watching.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
break;
case R.id.btn_5:
// foryou.setPaintFlags(foryou.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
break;
default:
foryou.setPaintFlags(foryou.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
【讨论】:
【参考方案8】:还有另一种好方法,不会浪费你的时间
创建方法来做任何你想做的事情,例如在你的活动中这样做
public void replaceSuggest(View v)
optionPanel.setVisibility(View.VISIBLE);
replaceWith.setVisibility(View.VISIBLE);
searchEdit.setText(selected);
创建你的方法后,转到 xml 视图布局并像这样放置(在你想要应用此操作的视图中,这里的示例是 TextView 将执行点击:
<TextView
android:id="@+id/anyId"
android:layout_
android:layout_
android:text="@string/replace"
android:textColor="#ffffff"
android:gravity="center_vertical"
android:paddingLeft="8dp"
android:paddingRight="4dp"
android:textSize="12dp"
// here you write the methode name after onClick
android:onClick="replaceSuggest"/>
【讨论】:
以上是关于Android:对超过 1 个按钮使用带有 setOnClickListener/onClick 的 SWITCH 语句?的主要内容,如果未能解决你的问题,请参考以下文章
带有 2 个按钮的 Android 主要活动可在 webview 中打开第二个活动