【问题标题】:Multiple Buttons' OnClickListener() android多个按钮的 OnClickListener() android
【发布时间】:2014-11-12 08:19:06
【问题描述】:

我目前正在 Android 上制作一个简单的计算器应用程序。我试图设置代码,以便在按下数字按钮时使用该数字更新计算器屏幕。目前我正在这样做。

    Button one = (Button) findViewById(R.id.oneButton);
    one.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            TextView output = (TextView) findViewById(R.id.output);
            output.append("1");
        }
    });

它有效,但我正在为计算器上的每个按钮编写相同的代码。正如您可以想象的那样,它非常多余。无论如何我可以以更有效的方式编写此代码吗?一个涉及不为每个按钮编写此方法的方法?

【问题讨论】:

  • 在你的类中实现onclick监听器,它将覆盖onclick方法。根据按钮id你可以进行操作
  • Bopathi,您能否详细解释一下我将如何编写一个按钮?我将按钮 ID 设为“1”,这样我就可以使用“this”来访问该号码。我不确定我将如何编辑 TextView。

标签: android onclicklistener


【解决方案1】:

你可以设置属性:

android:onClick="buttonClicked"

在每个按钮的 xml 文件中,并在 java 代码中使用它:

public void buttonClicked(View view) {

    if (view.getId() == R.id.button1) {
        // button1 action
    } else if (view.getId() == R.id.button2) {
        //button2 action
    } else if (view.getId() == R.id.button3) {
        //button3 action
    }

}

【讨论】:

【解决方案2】:

你可以用这个

    TextView output = (TextView) findViewById(R.id.output);
    one.setOnClickListener(youractivity.this);
    // set the onclicklistener for other buttons also

    @Override
    public void onClick(View v) {
      int id = v.getId();
    switch(id) {
    case R.id.oneButton:      
       append("1",output);
       break;
    case R.id.twoButton:
        append("2",output);
       break;
    case R.id.threeButton:
        append("3",output);
       break;
     } 
      }

 private void append(String s,TextView t){
  t.setText(s); 
}

您可以通过单独的方法识别 Activity 中的视图。

【讨论】:

    【解决方案3】:

    您只需按照以下步骤操作即可轻松...

    您不必为每个Button 编写新的onClickListener...只需将View.OnClickLister 实现到您的Activity/Fragment.. 它将实现称为onClick() 的新方法来处理onClick Button,TextView` 等的事件。

    1. 在您的Activity/Fragment 中实现OnClickListener()
    public class MainActivity extends Activity implements View.OnClickListener {
    
    }
    
    1. 在您的 Activity/Fragment 中实现 onClick() 方法
    public class MainActivity extends Activity implements View.OnClickListener {
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
        
        @Override
        public void onClick(View v) {
          // default method for handling onClick Events..
        }
    }
    
    1. 为按钮实现OnClickListener()
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.your_layout);
        
        Button one = (Button) findViewById(R.id.oneButton);
        one.setOnClickListener(this); // calling onClick() method
        Button two = (Button) findViewById(R.id.twoButton);
        two.setOnClickListener(this);
        Button three = (Button) findViewById(R.id.threeButton);
        three.setOnClickListener(this);
    }
    
    1. 按 ID 查找按钮并实现您的代码..
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.oneButton:
                // do your code
                break;
            case R.id.twoButton:
                // do your code
                break;
            case R.id.threeButton:
                // do your code
                break;
            default:
                break;
        }
    }
    

    请参考此链接了解更多信息:

    https://androidacademic.blogspot.com/2016/12/multiple-buttons-onclicklistener-android.html(更新)

    这将使处理许多按钮的点击事件变得更容易,并且看起来管理起来也很简单......

    【讨论】:

    • 第 4 点:@Override 标签上出现错误,警告我该方法不会从超类覆盖其方法。
    • @user2984127 适用于哪种情况?你是在片段还是活动中使用它?
    • @user2984127 尝试实现 View.OnClickListener。
    • @PragneshGhodashi 感谢您的回答。我在stackOverflow中询问后解决了它。 stackoverflow.com/questions/56965159/…
    • 太棒了。谢谢
    【解决方案4】:

    将每个按钮上的标签设置为您想要使用的任何内容,在这种情况下可能是整数。然后,您的所有按钮只需要一个 OnClickListener:

    Button one = (Button) findViewById(R.id.oneButton);
    Button two = (Button) findViewById(R.id.twoButton);
    one.setTag(new Integer(1));
    two.setTag(new Integer(2));
    
    OnClickListener onClickListener = new View.OnClickListener() {
    
        @Override
        public void onClick(View v) {
            TextView output = (TextView) findViewById(R.id.output);
            output.append(v.getTag());
        }
    }
    
    one.setOnClickListener(onClickListener);
    two.setOnClickListener(onClickListener);
    

    【讨论】:

    【解决方案5】:

    我创建了实现 View.OnClickListener 的专用类。

    public class ButtonClickListener implements View.OnClickListener {
    
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show();
        }
    
    }
    

    然后,我在 MainActivity 中创建了这个类的一个实例

    private ButtonClickListener onClickBtnListener = new ButtonClickListener();
    

    然后为按钮设置onClickListener

    btn.setOnClickListener(onClickBtnListener);
    

    【讨论】:

    • 可以,但是如果您使用多个按钮,您将始终调用同一个侦听器,您应该在 onClick 方法中添加一个带有每个按钮 id 的开关盒。
    • 我假设如果您为每个按钮创建一个类实例,也可以缓解这种担忧
    【解决方案6】:

    我遇到了类似的问题,我所做的是: 创建一个按钮数组

    Button buttons[] = new Button[10];
    

    然后为了实现点击监听器并引用 xml id,我使用了这样的循环

    for (int i = 0; i < 10; i++) {      
    String buttonID = "button" + i;
            int resID = getResources().getIdentifier(buttonID, "id",
                    "your package name here");
            buttons[i] = (Button) findViewById(resID);
            buttons[i].setOnClickListener(this);
        }
    

    但是调用它们与 Prag 的回答点 4 中的相同。 PS-如果有人有更好的方法来调用所有按钮的onClick,请发表评论。

    【讨论】:

      【解决方案7】:
      public class MainActivity extends AppCompatActivity implements OnClickListener  {
          Button  b1,b2;
          @Override
          protected void onCreate(Bundle savedInstanceState)
          {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              b1= (Button) findViewById(R.id.button);
              b2= (Button) findViewById(R.id.button2);
              b1.setOnClickListener(this);
              b2.setOnClickListener(this);
          }
      
      
          @Override
          public void onClick(View v)
          {
              if(v.getId()==R.id.button)
              {
                  Intent intent=new Intent(getApplicationContext(),SignIn.class);
                  startActivity(intent);
              }
              else if (v.getId()==R.id.button2)
              {
                  Intent in=new Intent(getApplicationContext(),SignUpactivity.class);
                  startActivity(in);
              }
          }
      }
      

      【讨论】:

        【解决方案8】:

        在你的 Activity/Fragment 中实现 onClick() 方法 公共类 MainActivity 扩展 Activity 实现 View.OnClickListener {

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
            }
        
            @Override
            public void onClick(View v) {
         switch (itemId) {
        
        // if you call the fragment with nevigation bar then used.
        
                   case R.id.nav_menu1:
                        fragment = new IntroductionFragment();
                        break;
        
        // if call activity with nevigation bar then used.
        
                    case R.id.nav_menu6:
                        Intent i = new Intent(MainActivity.this, YoutubeActivity.class);
                        startActivity(i);
              // default method for handling onClick Events..
            }
        }
        

        【讨论】:

          【解决方案9】:
          public void onClick(View v) {
              int id = v.getId();
              switch (id){
                  case R.id.button1:
                      //do ur code
                      Toast.makeText(this,"This is button 1",Toast.LENGTH_SHORT).show();
                      break;
                  case R.id.button2:
                      Intent intent = new Intent(this,SecondActivity.class);
                      Intent.putExtra("key",value);
                      startActivity(intent);
                      break;
                  case R.id.button3:
                      //do ur code
                      break;
                  case R.id.button4:
                      //do ur code;
                      break;
                  default:
                      //do ur code;
              }
          }
          

          【讨论】:

            【解决方案10】:

            我发现除了findViewById(btn).setOnClickListener(this) 的列表之外,使用长的 if/else 链(或开关)是丑陋的。如何使用覆盖创建新的 View.OnlickListeners,内联:

            findViewById(R.id.signInButton).setOnClickListener(new View.OnClickListener()
                { @Override public void onClick(View v) { signIn(); }});
            findViewById(R.id.signOutButton).setOnClickListener(new View.OnClickListener()
                { @Override public void onClick(View v) { signOut(); }});
            findViewById(R.id.keyTestButton).setOnClickListener(new View.OnClickListener()
                { @Override public void onClick(View v) { decryptThisTest(); }});
            findViewById(R.id.getBkTicksButton).setOnClickListener(new View.OnClickListener()
                { @Override public void onClick(View v) { getBookTickers(); }});
            findViewById(R.id.getBalsButton).setOnClickListener(new View.OnClickListener()
                { @Override public void onClick(View v) { getBalances(); }});
            

            【讨论】:

              【解决方案11】:

              不需要 if else 或 switch,让我们开始吧: 在您的每个按钮或其他任何按钮(我正在使用 ImageView)中,添加此属性 android:onClick="DoSomeThing"

              在您的活动中:

              public void DoSomeThing(View v){
                  ImageView img1= (ImageView) v; //you have to cast the view i.e. if it's button, it must be cast to Button like below line
              
                  Button b1= (Button) v;
              
                  img1.setImageBitmap(imageBitmap); //or anything you want to do with your view, This will work for all
              
                  b1.setText("Some Text");
               
              
              }
              

              【讨论】:

              • 这样就不用按id找view了,没有点击监听,没有多余的代码,简单如上!
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多