在 Android 布局中是否有 HTML 的 类 的替代方案?
Is there an alternative to HTML's classes in Android layouts?
在 Web 开发中,可以为某些 HTML 元素(例如按钮)设置 class
属性,这样您就可以将一些命令耦合到具有此 [=34] 的元素=] 仅(例如 js 侦听器、css 样式等)。
我想在 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
或其他任何方式明确说明哪些按钮
您可以遍历整个布局并检查 instanceof
,但如果您只关心 OnClickListener
,则可以使用 XML 实现
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:onClick="clicked" />
按钮将触发 Activity
内附加的 clicked(View v)
方法(如果方法未命中则抛出异常)...您可以将 OnClickListener
实现到 Activity
并在 XML 中直接使用 android:onClick="onClick"
。在 onClick
中,您也可以使用 switch(v.getId())
或任何您想识别哪个 View
触发了点击
ButterKnife 可能对您有所帮助。它有 @OnClick
注释,支持在单个绑定中使用多个 ID 进行常见事件处理。例如 activity:
@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
}
要在 List
中应用常见的 onTouchListener
注入按钮并定义 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);
在 Web 开发中,可以为某些 HTML 元素(例如按钮)设置 class
属性,这样您就可以将一些命令耦合到具有此 [=34] 的元素=] 仅(例如 js 侦听器、css 样式等)。
我想在 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
或其他任何方式明确说明哪些按钮
您可以遍历整个布局并检查 instanceof
,但如果您只关心 OnClickListener
,则可以使用 XML 实现
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:onClick="clicked" />
按钮将触发 Activity
内附加的 clicked(View v)
方法(如果方法未命中则抛出异常)...您可以将 OnClickListener
实现到 Activity
并在 XML 中直接使用 android:onClick="onClick"
。在 onClick
中,您也可以使用 switch(v.getId())
或任何您想识别哪个 View
触发了点击
ButterKnife 可能对您有所帮助。它有 @OnClick
注释,支持在单个绑定中使用多个 ID 进行常见事件处理。例如 activity:
@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
}
要在 List
中应用常见的 onTouchListener
注入按钮并定义 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);