是否可以在一个布局中制作两个具有相同 ID 的按钮?

Is it possible to make two buttons with same id in one layout?

是否可以在一个布局中制作两个具有相同 id 的按钮?

我尝试通过标签 <include> 来完成,但对其中一个按钮的监听器不起作用

编辑 2016:

这不再可能了,android lint 检查会阻止您在同一个 xml 文件中添加相同的 ID。 解决方法是使用 include 标记来包含其他具有重复 ID 的 xml。 然而,这是一种应该避免的方法。

旧答案

TL:DR; View Container 中只能有distince ids,如果你再创建一个container,你可以使用parent.findViewById(R.id.child_id);

引用它

尽管您的用例在设计层面上似乎存在缺陷,但这是可能的

 <LinearLayout
    android:id="@+id/parent"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
   android:padding="30dp">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />
<RelativeLayout
android:id="@+id/button_2"
android: layout_width="match_parent"
android:layout_height="match_parent">
<include
    android:id="@+id/second_buttonLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    layout="@layout/title_bar" />
</RelativeLayout>
</LinearLayout>

为了给两个按钮设置监听器,

  findViewById(R.id.button1); //referring to first button
((RelativeLayout)findViewById(R.id.button_2)).findViewById(R.id.button_of_include) //referring to second button

EDIT 基于 ,一个 关键点 为包含 include.This 将允许您引用布局及其子布局。即:

<RelativeLayout
        android:id="@+id/button_2"
        android: layout_width="80dp"
        android:layout_height="80dp">

            <include
                 android:layout_width="80dp"
                 android:layout_height="80dp"
                 layout="@layout/include_layout" />
    </RelativeLayout>

这是不可能的。但是如果我想将同一个监听器绑定到一些相等的视图,你可以使用标签。例如:

<ImageView
                android:id="@+id/map_button_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:tag="button"
                android:src="@drawable/button" />

添加方法以通过标签获取所有视图:

private static ArrayList<View> getViewsByTag(ViewGroup root, String tag){
ArrayList<View> views = new ArrayList<View>();
final int childCount = root.getChildCount();
for (int i = 0; i < childCount; i++) {
    final View child = root.getChildAt(i);
    if (child instanceof ViewGroup) {
        views.addAll(getViewsByTag((ViewGroup) child, tag));
    }

    final Object tagObj = child.getTag();
    if (tagObj != null && tagObj.equals(tag)) {
        views.add(child);
    }

    }
    return views;
}

现在就像使用它一样

List<View> myViews = getViewsByTag(rootView, "button");

我这样做了

<LinearLayout
    android:id="@+id/parent"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="30dp">

    <Button
        android:id="@+id/button_1"
        android:layout_width="80dp"
        android:layout_height="80dp"
         />

    <RelativeLayout
        android:id="@+id/button_2"
        android: layout_width="80dp"
        android:layout_height="80dp">

            <include
                 android:layout_width="80dp"
                 android:layout_height="80dp"
                 layout="@layout/include_layout" />
    </RelativeLayout>
</LinearLayout>

inlcude_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"        
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    <Button
        android:id="@+id/button_1" // the same id
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
         />
</RelativeLayout>

在我的class

Btn[0] = (Button).findViewById(R.id.button_1);      
Btn[1] = (Button)((RelativeLayout).findViewById(R.id.button_2)).findViewById(R.id.button_1);

结果是在一个布局中放置两个按钮,一个 id,一个监听器!

项目https://github.com/kgsnick/TwoButtonWithOneId