多个按钮的OnClickListener()android


82

我目前正在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,您可以进行操作
学习者

Boopathi,您能解释一下我如何编码一个按钮吗?我将按钮ID设置为“ 1”,这样我就可以使用“ this”访问数字。我不确定我该如何编辑TextView。
user3011685

Answers:


239

您只需简单地按照以下步骤进行操作即可...

您不必onClickListener为Every Button...编写新的...只需View.OnClickLister对您的Activity/实施即可Fragment。它将实现onClick()用于处理ButtonTextView等onClick事件的新方法。

  1. OnClickListener()在您的Activity/中实施Fragment
public class MainActivity extends Activity implements View.OnClickListener {

}
  1. 在活动/片段中实现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标记出现错误,警告我该方法不能覆盖超类的方法。
KasparTr '16

@ user2984127在哪种情况下?您是否正在将其与片段或活动一起使用?
Pragnesh Ghodaシ

@ user2984127尝试实现View.OnClickListener。
Pragnesh Ghoda

在使用Eclipse时,我多次使用这种方法,但是现在我切换到Android Studio,并收到错误消息“无法在Android库模块的switch语句中使用资源ID”。从SDK工具R14开始,资源ID不是最终的。推荐的解决方法是用if / else语句替换开关。
天蝎座

@Scorpio:我也正在使用android studio。但是我从来没有得到那个错误。请检查您使用的是正确的方法,并使用view.getId(),您将获得单击按钮的ID。这是一个示例,您根据需要进行了一些更改。干杯。:)
Pragnesh Ghodaシ

53

您可以设置属性:

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
    }

}

4
最好使用开关
Ali Khaki

1
@AliKhakiswitch在某些情况下可能不起作用。在这里解释:tools.android.com/tips/non-constant-fields
Andro

8

将每个按钮上的标签设置为您要使用的任何内容,在这种情况下,可能是整数。然后,您只需要一个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);

1
另请参阅有关标签用途的答案
Henrik Christensen

8

我创建了实现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的开关盒。
lebarillier

我假设您是否为每个按钮创建一个类实例,这也会缓解这种担忧
Matt Strom

3
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);
        }
    }
}

1

我有一个类似的问题,我所做的是:创建一个Button数组

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,请发表评论。


1
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;
    }
}

1

你可以用这个

    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); 
}

您可以使用单独的方法来标识活动中的视图。


1

在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..
    }
}

0

我发现除了列表之外,使用长的if / else链(或开关)也findViewById(btn).setOnClickListener(this)很丑陋。如何使用内联重写创建新的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(); }});

0

不需要其他或开关,让我们开始:在您的每个Button或其他按钮(我正在使用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查找视图,无需单击侦听器,无需冗余代码,就像上面一样简单!
Zubair Younas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.