在Web开发中,可以将class
属性设置为某些HTML元素(例如按钮),这样您就可以将一些命令耦合到仅具有此类的元素(例如js listeners,css styles等等..)。
我想在Android中做类似的事情。我有几个按钮,我想设置一些听众以相同的方式在所有这些上工作。我想使用setOnTouchListener
,这不能像android:onClick
一样简单地添加到布局文件中。
我所知道的唯一方法是定义一个OnTouchListener
,然后分别做一些事情:
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button);
Button button3 = (Button) findViewById(R.id.button3);
然后
button1.setOnClickListener(myOnTouchListener);
button2.setOnClickListener(myOnTouchListener);
button3.setOnClickListener(myOnTouchListener);
还有其他办法吗?最佳地,我想做一些类似于在JQuery中完成这些事情的事情(例如$(".my-buttons").setListener(...);
)
关键是我想避免使用R.id
或其他
答案 0 :(得分:2)
ButterKnife可能对您有所帮助。它具有@OnClick
注释,支持单个绑定中的多个ID以进行常见事件处理。例如,在活动中:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
ButterKnife.inject(this);
// Use "injected" views...
}
@OnClick({ R.id.button1, R.id.button2, R.id.button3 })
public void handleButtonClick(Button button) {
// handle clicks
}
在onTouchListener
中应用常见List
注入按钮并定义ButterKnife.Setter
操作:
@InjectViews({ R.id.button1, R.id.button2, R.id.button3 })
List<Button> buttons;
static final ButterKnife.Setter<Button, OnTouchListener> SETTER = new ButterKnife.Setter<Button, OnTouchListener>() {
@Override
public void set(Button view, OnTouchListener value, int index) {
view.setOnTouchListener(value);
}
};
Butterknife.inject(this)
申请onTouchListener
之后的任何地方:
ButterKnife.apply(buttons, SETTER, onTouchListener);
答案 1 :(得分:1)
您可以遍历整个布局并检查instanceof
,但如果您只关心OnClickListener
,则可以使用XML实现
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:onClick="clicked" />
按钮会在附加的clicked(View v)
内触发Activity
方法(如果方法未命中,则会抛出异常)...您可以将OnClickListener
实施为Activity
并在XML中直接使用android:onClick="onClick"
。在onClick
内你也可以使用switch(v.getId())
或任何你想要识别哪个View
点击了