ravelinx
ravelinx

Reputation: 1765

How can I have one unique button in multiple components of a layout in android?

So I have an xml that consists of a linear layout containing a Button and a TextView like this:

 <?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>

And I want to use this same layout inside other layouts in a different xml. I need the same button at every time, so I reuse it by including it in the two layouts (both layouts are in the same xml, but ones is hidden):

First one

<?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>

Second One:

 <?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>

So I show the first layout and hide the second one at the beginning of the app , as the user moves within the interface, the layouts exchange so that the other one is shown and the first one hidden.

The thing is that I declare the Button in my java activity class like this:

   btnCell = (Button) thirdView.findViewById(R.id.btnCell);
    btnCell.setOnClickListener(this);

And implemented the listener.

    @Override
    public void onClick(View v) {

        if (v == btnCell) {
            System.out.println("entered if");
        }
System.out.println("entered function");
    }

The problem is that when I click the button when the first view is shown and the second hidden, the button works just fine, but when I unhide the second layout, hide the first one, and proceed to click the button, that should be the same as the first one but in a different layout, nothing happens. I searched and find out, that this happens because the id is assigned only to the button shown in the first layout because of view hierarchy, but not the one in the second layout. How can I make both buttons react to the same action, without declaring a new button in each layout but instead reusing it?

Upvotes: 2

Views: 887

Answers (3)

You can add a different Id for each included layout:

<include android:id="+id/layout_a" layout="@layout/buttonLayout"/>

and

<include android:id="+id/layout_b" layout="@layout/buttonLayout"/>

and then use two findViewById to reach them:

btnCellA = (Button)thirdView.findViewById(R.id.layout_a).findViewById(R.id.btnCell);
btnCellB = (Button)thirdView.findViewById(R.id.layout_b).findViewById(R.id.btnCell);

Upvotes: 1

Vijay Makwana
Vijay Makwana

Reputation: 486

The Problem is both the layout are include in same layout file and the id of that button are same so whenever you click on any of the button at the same time event will fire on both button like both are clicked. So, you have to give the different id for both the button I hope it works fine..

Upvotes: 1

Jitendra
Jitendra

Reputation: 3698

I have used this type of layout. you can create Id different for both and inflate that view and give different name so You can differentiate both thing.

<?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 second one is

 <?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>

Upvotes: 1

Related Questions