所以我有一个xml,它包含一个包含Button和TextView的线性布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="vertical">
<Button
android:id="@+id/btnCell"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:paddingLeft="40dp"
android:text="Button"
android:textColor="@color/blueText" />
<View
android:height="wrap_content"
android:width="wrap_content"
android:background="@drawable/Test"/>
</LinearLayout>
我想在不同的xml中使用其他布局中的相同布局。我每次都需要相同的按钮,所以我通过将它包含在两个布局中来重复使用它(两个布局都在同一个xml中,但是隐藏了一个):
第一个
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/image"
/>
<include layout="@layout/buttonLayout"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
第二个:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/image"
/>
<include layout="@layout/buttonLayout"/>
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
所以我展示了第一个布局,并在应用程序开头隐藏了第二个布局,当用户在界面内移动时,布局交换,以便显示另一个,隐藏第一个。
问题是我在我的java活动类中声明了Button,如下所示:
btnCell = (Button) thirdView.findViewById(R.id.btnCell);
btnCell.setOnClickListener(this);
并实施了听众。
@Override
public void onClick(View v) {
if (v == btnCell) {
System.out.println("entered if");
}
System.out.println("entered function");
}
问题是当我在第一个视图显示时单击按钮而第二个隐藏时,按钮工作正常,但当我取消隐藏第二个布局时,隐藏第一个布局,然后继续单击按钮,应该与第一个相同,但在不同的布局中,没有任何反应。我搜索并发现,这是因为视图层次结构只将id分配给第一个布局中显示的按钮,而不是第二个布局中的id。如何让两个按钮对同一个动作做出反应,而不是在每个布局中声明一个新按钮而是重复使用它?
答案 0 :(得分:1)
我使用过这种布局。您可以为两者创建不同的ID并为该视图充气,并给出不同的名称,以便您可以区分这两种情况。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/image"
/>
<include android:id="+id/firstOne" layout="@layout/buttonLayout"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
android第二个是
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/image"
/>
<include android:id="+id/secondTwo" layout="@layout/buttonLayout"/>
<CheckBox
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
答案 1 :(得分:1)
问题是布局是否包含在相同的布局文件中以及它的id 按钮是相同的,所以每当你点击任何一个按钮的同时,事件将同时触发两个按钮,就像点击两个按钮一样。 因此,您必须为按钮提供不同的ID,我希望它能正常工作..
答案 2 :(得分:1)
您可以为每个包含的布局添加不同的ID:
<include android:id="+id/layout_a" layout="@layout/buttonLayout"/>
和
<include android:id="+id/layout_b" layout="@layout/buttonLayout"/>
然后使用两个findViewById来达到它们:
btnCellA = (Button)thirdView.findViewById(R.id.layout_a).findViewById(R.id.btnCell);
btnCellB = (Button)thirdView.findViewById(R.id.layout_b).findViewById(R.id.btnCell);