如何为Android片段中的多个按钮定义setOnTouchListener

时间:2015-08-11 15:43:22

标签: android android-fragments

我有一个带有多个按钮的片段。对于每个按钮,我创建了一个setOnTouchListener,例如下面的代码。

Button btnOne = (Button) view.findViewById(R.id.button_one);
Button btnTwo = (Button) view.findViewById(R.id.button_two);

btnOne.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        myMethod(btnOne);
        return false;
    }
});

btnTwo.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        myMethod(btnTwo);
        return false;
    }
});

如何在所有按钮中创建一个通用方法setOnTouchListener?我想要这样的事情:

btnOne.method();
btnTwo.method();
btnThree.method();
...

3 个答案:

答案 0 :(得分:1)

您可以使用相同的OnTouchListener并使用view.getId()区分不同的视图:

View.OnTouchListener listener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v.getId() == R.id.button_one) {
            // do your thing
        }
        else if (v.getId() == R.id.button_two) {
            // do your thing
        }
        return false;
    }
};

由于您似乎为两个按钮调用相同的myMethod(Button)方法,因此可以缩短它:

View.OnTouchListener listener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        myMethod(v);
        return false;
    }
};

myMethod可以安全地将View v转换为Button对象((Button)v)以使用Button特定对象。

请注意,您应该在onTouch中返回true而不是false以消耗触摸事件。

答案 1 :(得分:1)

创建一个返回View.OnTouchListener的方法,并将该对象传递给setOnTouchListener的参数。

btnTwo.setOnTouchListener(getTouchListener());

public View.OnTouchListener getTouchListener() {
    return new View.OnTouchListener() { ... } 
}

答案 2 :(得分:1)

您正在使用内部匿名类对象来实现接口presentationNode

如果我是你,最好在View.OnTouchListener(或其他独立的外部类)中实现界面:

Fragment

使用参数public class MyFragment extends Fragment implements View.OnTouchListener { (...) @Override public boolean onTouch(View v, MotionEvent event) { return myMethod(v); } (...) } 定义myMethod。您可以使用每个View v对象View来区分按钮(已经在Emanuel Moecklin的回答中提到过)。

id

最后,您可以非常巧妙地为多个按钮设置相同的public class MyFragment extends Fragment implements View.OnTouchListener { (...) private boolean myMethod(View v) { switch (v.getId()) { case R.id.button_one: (...) return true; case R.id.button_two: (...) return true; case R.id.button_three: (...) return true; (...) default: return false; } } (...) } 对象。

OnTouchListener