2

I am building an Android application in which I am using Data binding library. I am little new to Data binding concept and looking for the solution for the following

There is a layout file called otp_validation.xml

<data>
    <variable
        name="otpViewModel"
        type="dial.to.go.otp.OTPViewModel" />
</data>
<ConstraintLayout
 .....................
 .....................
 .....................
<LinearLayout
            android:id="@+id/otp_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/_20sdp"
            android:orientation="horizontal"
            android:weightSum="4">

            <androidx.appcompat.widget.AppCompatEditText
                android:layout_width="@dimen/_40sdp"
                android:layout_height="@dimen/_50sdp"
                android:layout_weight="1"
                android:background="@drawable/all_edit_selector"
                android:gravity="center"
                android:inputType="number"
                android:maxLength="1"
                android:textSize="@dimen/_22sdp" />

            <androidx.appcompat.widget.AppCompatEditText
                android:layout_width="@dimen/_40sdp"
                android:layout_height="@dimen/_50sdp"
                android:layout_marginLeft="@dimen/_8sdp"
                android:layout_weight="1"
                android:background="@drawable/all_edit_selector"
                android:gravity="center"
                android:inputType="number"
                android:maxLength="1"
                android:textSize="@dimen/_22sdp" />

</LinearLayout>


        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_marginTop="@dimen/_30sdp"
            android:background="@color/colorPrimary"
            android:backgroundTint="@color/colorPrimary"
          
          <!-- I want to pass the view object of otp container as a parameter in the method validateOTP()
            android:onClick="@{() -> otpViewModel.validateOTP()}"
           
            android:src="@drawable/drawable_fab_proceed"
            app:borderWidth="0dp"
            app:fabSize="normal"
            app:rippleColor="@color/colorAccent" />
           
</ConstraintLayout>

Please notice the method validateOTP() being invoked in onClick event. I would like to send the view object of linear layout (otp_container) as a parameter. Please help me out for providing me the solution for this.

3
  • You should not pass the view to the view model. Commented Jan 18, 2021 at 12:00
  • 1
    @HimanshuChoudhary, Okay. I want to get the LinearLayout and read the values of it children. How to achieve this ? Commented Jan 18, 2021 at 13:03
  • 1
    A better deal would be to call the onClickListener programmatically inside the view. Commented Jan 18, 2021 at 13:30

2 Answers 2

2

To pass the view which is clicked then you can do it

android:onClick="@{(view)->viewModel.onOthers(view)}"

To pass a view other than the clicked view, pass the id,

android:onClick="@{(view)->viewModel.onOthers(otpContainer)}"

Note that the signature of the method should be like

fun onOthers(view:View){
  //your code goes here
}

So that it can allow any type of view.

UPDATE otp_container will be otpContainer for Binding.

Sign up to request clarification or add additional context in comments.

Comments

1

The logic of binding objects to an XML would pretty much be the same, create those objects in the activity/fragment class, initialize the corresponding variables in the XML file and use binding to bind the objects and variables.

Try the following

Activity class

val yourLinearLayout = findViewById<View>(R.id.otp_container)
binding.view = yourLinearLayout 

XML File

<data>
    <variable
        name="otpViewModel"
        type="dial.to.go.otp.OTPViewModel" />

    <variable
        name = "view"
        type = "android.widget.LinearLayout"
</data>

//rest of the logic

     <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        ..........          
        ..........
        android:onClick="@{() -> otpViewModel.validateOTP(view)}"
        ..........
        ........./>

Though it works, its indeed a bad practice. Viewgroup must know nothing about the views because if the activity/fragment gets destroyed/recreated, the view references in the viewgroup would lead to memory leaks

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.