【问题标题】:How to know what is the button id that was clicked - android如何知道被点击的按钮 id 是什么 - android
【发布时间】:2012-12-23 08:12:11
【问题描述】:

我在我的应用程序中创建了 3 个按钮,点击后会转到 giveClue 方法。

<ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="24dp"
        android:layout_height="22dp"
        android:layout_alignTop="@+id/lifeButtonsLbl"
        android:layout_toLeftOf="@+id/ImageButton2"
        android:src="@drawable/icon"
        android:onClick="giveClue" />

    <ImageButton
        android:id="@+id/ImageButton2"
        android:layout_width="24dp"
        android:layout_height="22dp"
        android:layout_alignTop="@+id/imageButton1"
        android:layout_toLeftOf="@+id/ImageButton3"
        android:src="@drawable/icon" 
        android:onClick="giveClue"/>

    <ImageButton
        android:id="@+id/ImageButton3"
        android:layout_width="24dp"
        android:layout_height="22dp"
        android:layout_alignRight="@+id/frameLayout1"
        android:layout_alignTop="@+id/ImageButton2"
        android:src="@drawable/icon"
        android:onClick="giveClue" />

注意:我不想使用不同的方法

活动课:

public void giveClue(View view) {
        gameAdapter.giveClue(game);
    }

我的问题是我想禁用被点击的按钮。我不想为每个按钮使用不同的方法。是否可以确定单击了哪个按钮,以便我可以禁用它。

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    实现如下一种方法,获取布局子对象的id

    public static void ButtonBar(final Activity a) {
        //if linear instantiate LinearLayout, if RelativeLayout instantiate RelaytiveLayout
       final LinearLayout ll = (LinearLayout) a.findViewById(R.id.your_layout_id);
          for (int i = ll.getChildCount() - 1; i >= 0; i--) {
    
            View v = ll.getChildAt(i);
    
            v.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View v) {
    
                    switch (v.getId()) {
                    case R.id.ImageButton1:
                        //disable here
                        break;
                    case R.id.ImageButton2:
                //disable here                      
                break;
                        case R.id.ImageButton3:
                //disable here                      
                break;
    
                    }}});
        }
      }
    

    在 giveClue 方法中只需调用上述方法..

    public void giveClue(View view) {
           ButtonBar(this);
              // gameAdapter.giveClue(game);
    
    }
    

    我认为这可能有效..

    【讨论】:

      【解决方案2】:

      让你的班级实现 `View.OnClickListener',比如

      public class MyActivity extends Activity implements View.OnClickListener {
      
      Button button1, button2, button3;
      
      @Override
      public void onCreate(Bundle bundle) {
          super.onCreate();
      
          ...
      
          button1 = (Button) findViewById(R.id.button1);
          button2 = (Button) findViewById(R.id.button2);
          button3 = (Button) findViewById(R.id.button3);
      
          button1.setOnClickListener(this);
          button2.setOnClickListener(this);
          button3.setOnClickListener(this);
          }
      
           @Override
            public void onClick(View v) {
             switch(v.getId()) {
               case R.id.button1:
             // do stuff;
             break;
             case R.id.button2:
             // do stuff;
             break;
         ...
             }
            }
      

      【讨论】:

        【解决方案3】:

        来自:Android OnClickListener - identify a button

        您将学会做这件事的简单方法是:

        public class Mtest extends Activity {
          Button b1;
          Button b2;
          public void onCreate(Bundle savedInstanceState) {
            ...
            b1 = (Button) findViewById(R.id.b1);
            b2 = (Button) findViewById(R.id.b2);
            b1.setOnClickListener(myhandler1);
            b2.setOnClickListener(myhandler2);
            ...
          }
          View.OnClickListener myhandler1 = new View.OnClickListener() {
            public void onClick(View v) {
              // it was the 1st button
            }
          }
          View.OnClickListener myhandler2 = new View.OnClickListener() {
            public void onClick(View v) {
              // it was the 2nd button
            }
          }
        }
        

        或者,如果您只使用一个 clicklistener,您可以这样做:

        View.OnClickListener myOnlyhandler = new View.OnClickListener() {
          public void onClick(View v) {
              if( b1.getId() == ((Button)v).getId() ){
                  // it was the first button
              }
              else if( b2.getId() == ((Button)v).getId() ){
                  // it was the second button
              }
          }
        }
        

        不过,我不建议这样做,因为您必须为您使用的每个按钮添加一个if。这很难维护。

        【讨论】:

          【解决方案4】:

          由于您作为onClick 的参数获得的view 代表被点击的视图,您只需调用setEnabled(false) 即可禁用该按钮。

          public void giveClue(View view) {
              ((Button)view).setEnabled(false);  // disable button
          }
          

          【讨论】:

            【解决方案5】:

            像这样..

            public void giveClue(View view) {
                if( b1.getId() == view.getId() ){
                  // it was the first button
                }
                else if( b2.getId() == view.getId() ){
                  // it was the second button
                }
              }
            

            【讨论】:

            • 是否需要将视图投射到 Button?
            【解决方案6】:

            在XML中有一个Tag的属性

            android:tag=""
            

            您可以为所有三个按钮添加标签,并使用该标签相应地处理它们

            【讨论】:

              【解决方案7】:

              giveClue 方法中检查view.getId() 并将其与R.id.imageButton1 等进行比较。通常使用switch-case 完成:)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-07-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多