如何在android中的布局的多个组件中有一个唯一的按钮?

时间:2016-07-15 05:41:27

标签: android android-layout android-studio layout

所以我有一个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。如何让两个按钮对同一个动作做出反应,而不是在每个布局中声明一个新按钮而是重复使用它?

3 个答案:

答案 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);