Android按钮:缩短OnClick方法

时间:2016-05-16 16:56:18

标签: java android button onclicklistener

是否可以让多个按钮调用相同的方法?我的意思是参数将是按钮的ID。我的问题是我有一个非常非常长的开关案例功能,每个案例都有相同的方法。这是我的代码片段(我缩短了它):

public class HerkunftRind extends Activity implements   View.OnClickListener, Animator.AnimatorListener {

private static final String TAG = "HerkunftRind";
ViewFlipper viewFlipper;
ImageButton myButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.herkunft_rind);

    viewFlipper = (ViewFlipper) findViewById(R.id.herkunft_rinder_view_flipper);

    ImageButton imageButton = null;
    imageButton = (ImageButton) findViewById(R.id.button_1);
    imageButton.setOnClickListener(this);
    imageButton = (ImageButton) findViewById(R.id.button_2);
    imageButton.setOnClickListener(this);
    imageButton = (ImageButton) findViewById(R.id.button_3);
    imageButton.setOnClickListener(this);
    imageButton = (ImageButton) findViewById(R.id.button_4);
    imageButton.setOnClickListener(this);
    }
public void setAnimationFade(int id) {
    myButton = (ImageButton) findViewById(id);
    ObjectAnimator animator = ObjectAnimator.ofFloat(myButton, View.ALPHA, 0.5f, 1f);
    animator.setDuration(300); //ms
    animator.start();
    animator.addListener(this);
}
@Override
public void onAnimationStart(Animator animation) {
    myButton.setAlpha(1f);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button_1: {
            setAnimationFade(R.id.button_1);
            text = (TextView) findViewById(R.id.button_1_text_1);
            text.setVisibility(View.VISIBLE);
            text = (TextView) findViewById(R.id.button_1_text_2);
            text.setVisibility(View.VISIBLE);
            break;
        }
        case R.id.button_2: {
            setAnimationFade(R.id.button_2);
            text = (TextView) findViewById(R.id.button_2_text_1);
            text.setVisibility(View.VISIBLE);
            text = (TextView) findViewById(R.id.button_2_text_2);
            text.setVisibility(View.VISIBLE);
            break;
        }
        case R.id.button_3: {
            setAnimationFade(R.id.button_3);
            text = (TextView) findViewById(R.id.button_3_text_1);
            text.setVisibility(View.VISIBLE);
            text = (TextView) findViewById(R.id.button_3_text_2);
            text.setVisibility(View.VISIBLE);
            break;
        }
        case R.id.button_4: {
            setAnimationFade(R.id.button_4);
            text = (TextView) findViewById(R.id.button_4_text_1);
            text.setVisibility(View.VISIBLE);
            text = (TextView) findViewById(R.id.button_4_text_2);
            text.setVisibility(View.VISIBLE);
            break;
        }

我不想要的是直接在XML文件中定义它。我可以缩短它吗?

3 个答案:

答案 0 :(得分:2)

是的,你可以,我个人经常这样做 您可以在xml布局中调用该方法。

即:

<Button
     android:onClick="myMethod()"
/>

请注意myMethod() 必须具有类似

的签名
public void myMethod(View v)

在myMethod中,您可能想要识别哪个是您点击的视图(也可以是异构),然后采取相应的行动。

只需添加switch(),您可以使用v.getId()来确定触发事件的视图。

这样的事情:

switch(v.getId())
{
    case R.id.txtPhone:
    {
        // Do something
        // ...
        break;
    }
    case R.id.txtMenu:
    {
        // Show options menu
        // ...
        break;
    }
    // ...
    default:
    {
        break;
    }
}

答案 1 :(得分:1)

这里有点多余:

public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button_1: {
            setAnimationFade(R.id.button_1);
            text = (TextView) findViewById(R.id.button_1_text_1);
            text.setVisibility(View.VISIBLE);
            text = (TextView) findViewById(R.id.button_1_text_2);
            text.setVisibility(View.VISIBLE);
            break;
        }
        case R.id.herkunft_rinder_bauer2_button: {
            setAnimationFade(R.id.button_2);
            text = (TextView) findViewById(R.id.button_2_text_1);
            text.setVisibility(View.VISIBLE);
            text = (TextView) findViewById(R.id.button_2_text_2);
            text.setVisibility(View.VISIBLE);
            break;
        }
...

为什么你不在空洞切换案例之前调用setAnimationFade .. ??

 public void onClick(View v) {
        setAnimationFade(v.getId());
        switch (v.getId()) {
            case R.id.button_1: {
                setAnimationFade(R.id.button_1

答案 2 :(得分:1)

如果您不想使用长onClick方法,那么您可以为每个按钮编写一个onClick侦听器。

例如:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });


anotherButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });