是否可以在一个布局中制作两个具有相同 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,一个监听器!
是否可以在一个布局中制作两个具有相同 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 基于
<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,一个监听器!