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 中打开第二个活动

带有 2 个按钮的渐进式 Web 应用程序的 Android 推送通知?

带有按钮的 Android 前台服务通知

在java中插入超过8000个字符并带有换行符的sql列

对 Android 中的触觉反馈感到困惑

Android:我的带有 ListView 的 App Widget 未通过按钮或更新周期进行更新