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