Android-为每个按钮自动查找并创建setOnClickListener

时间:2019-01-06 00:32:54

标签: java android

我有几十个按钮,每个按钮我想要为以下目的做

Button abcdefg = (Button) this.findViewById(R.id.abcdefg);
        abcdefg.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
                audiotoplay = "abcdefg";
                playAudio(audiotoplay);
            }
        });

在这种情况下,对于每个按钮,有比复制和粘贴每个按钮的代码块并用每个按钮ID替换abcdefg更为简单的方法吗?

4 个答案:

答案 0 :(得分:2)

在strings.xml中创建一个字符串数组,其中包含按钮ID的字符串,例如:

<string-array name="buttonids">
    <item>abc</item>
    <item>def</item>
    <item>ghi</item>
</string-array>

,然后在您的活动中,获取此数组,并为每个字符串ID使用getIdentifier()获取按钮的整数ID。
然后通过findViewById()获得对每个按钮的引用并设置侦听器:

String[] buttonids = getResources().getStringArray(R.array.buttonids);
for (String buttonid : buttonids) {
    final String name = buttonid;
    int id = getResources().getIdentifier(name, "id", getPackageName());
    Button button = findViewById(id);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            audiotoplay = name;
            playAudio(audiotoplay);
        }
    });
}

我假设像您的示例代码一样,您将每个按钮的字符串ID分配给变量audiotoplay
如果您在应用中添加或删除按钮,则唯一要做的更改就是从strings.xml的数组中添加或删除其字符串ID。

答案 1 :(得分:1)

您可以尝试黄油刀https://github.com/JakeWharton/butterknife

@OnClick(R.id.submit1)
@OnClick(R.id.submit2) 
@OnClick(R.id.submit3) 
@OnClick(R.id.submit4)  
void submit() {
    // Clicked ...
}

答案 2 :(得分:0)

您始终可以创建一个从Button扩展的类,并在那里定义该特定行为。之后,您需要更新布局.xml以使用新类,而不是默认类。

我不确定用例-但是如果您需要ID,可以将其另存为button标记,然后从 OnClick 进行访问。

例如:

public class YourButtonClass extends AppCompatButton {

....

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();

    setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            audiotoplay = getTag();
            playAudio(audiotoplay);
        }
    });
}

}

在您的活动/片段中:

findViewById<YourButtonClass>(R.id.btn_your_button).setTag("123")

并在您的布局上:

<this.is.your.package.name.YourButtonClass
    android:id="@+id/btn_your_button"
    ...
/>

答案 3 :(得分:0)

最简单的方法是使用标签。布局xml中的每个按钮都应具有

android:onClick="buttonClick"
android:tag="abcd1234"

然后,您应该在活动

中具有一个功能
public void buttonClick(View v) { 
    audiotoplay = v.getTag();
    playAudio(audiotoplay); 
}

您不必调用任何在xml中设置的setOnClickListener。只要确保buttonClick方法在您的 Activity 类中,而不是 Fragment 类中即可。您可以将其命名为任意名称,我只是使用buttonClick与其他onClick区别开来。如果必须在Fragment中使用它,则可以使用相同的代码将一个onClickListener分配给一个变量(或让Fragment实现onClickListener),然后在所有按钮上调用setOnClickListener。