【问题标题】:Android: Use a SWITCH statement with setOnClickListener/onClick for more than 1 button?Android:对超过 1 个按钮使用带有 setOnClickListener/onClick 的 SWITCH 语句?
【发布时间】: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;
}

【问题讨论】:

  • 我不喜欢为此使用菜单,因为我可以将按钮放在布局上我想要的任何位置......

标签: android button listener


【解决方案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_width="wrap_content"
                                android:layout_height="wrap_content"
                                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"/>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-16
          • 1970-01-01
          • 1970-01-01
          • 2011-06-26
          • 2015-05-01
          • 1970-01-01
          • 2015-10-11
          • 1970-01-01
          相关资源
          最近更新 更多