Monday, 5 April 2021

ViewBinding- not working for child layouts

I'm currently updating the source code with the ViewBindings but I'm not getting them to work for child layouts of the other modules which was working previously. I'm on Android Studio 4.1.3. I added viewBinding.enabled = true to app modules build.gradle. But when I try to access a button from the child layouts, it does not give any error but it does not perform the operation also.

main_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000">

<com.playerview.TestPlayerView
    android:id="@+id/testPlayerView"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    app:v3PlaybackEnabled="true"
    app:always_show_go_to_live="true"
    app:extra_overlay_layout = "@array/extra_overlays"
    app:server_side_ad_overlay_index = "1"
    app:hide_play_pause_on_live="true"
    app:show_partner_logo="true"
    app:hide_seek_controllers_on_live="true"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:show_subtitle_on_full_screen="true" />

</androidx.constraintlayout.widget.ConstraintLayout>

FragmentBindingProvider.kt

class FragmentBindingProvider private constructor(
val btnPlayNext: Button?,
val testPlayerView: TestPlayerView,
val txtPlaylistPosition: TextView?,
val btnMute: ToggleButton?,
private val root: View
) : ViewBinding {

override fun getRoot(): View = root

companion object {
    fun inflate(isLogoView: Boolean, inflater: LayoutInflater, container: ViewGroup?): FragmentBindingProvider {
        return if (isLogoView) initLogo(inflater, container) else init(inflater, container)
    }

    private fun initLogo(inflater: LayoutInflater, container: ViewGroup?): FragmentBindingProvider {
        val binding = FragmentLogoBinding.inflate(inflater, container, false)
        return FragmentBindingProvider(
            btnPlayNext = binding.btnPlayNext,
            testPlayerView = binding.testPlayerView,
            txtPlaylistPosition = binding.txtPlaylistPosition,
            btnMute = binding.testPlayerView.findViewById(R.id.btnMute),
            root = binding.root
        )
    }
  }
}

player_video_controls.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone"
    tools:visibility="visible">

         <include
        android:id="@+id/player_volume_layout"
        layout="@layout/view_controls_volume"
        android:layout_width="@dimen/player_ad_volume_width"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="@id/bottom_bar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="@id/bottom_bar" />

</androidx.constraintlayout.widget.ConstraintLayout>

view_controls_volume.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:background="@color/transparent_black_percent_80">

    <ToggleButton
        android:id="@+id/btnMute"
        android:layout_width="@dimen/top_controls_icon_width"
        android:layout_height="@dimen/top_controls_icon_height"
        android:layout_gravity="center"
        android:background="@drawable/ic_volume"
        android:contentDescription="@null"
        android:scaleType="center"
        android:checked="true"
        android:textOff=""
        android:textOn="" />

</FrameLayout>

MainFragment.kt

override fun onStart() {
    super.onStart()
    observeViewModel()

    /*Here calling view of child layout*/
    binding.btnMute?.setOnCheckedChangeListener { v, isChecked ->
        if (isChecked && binding.testPlayerView.isMuted()) {
            binding.testPlayerView.unmute()
        } else {
            binding.testPlayerView.mute()
        }
    }
}

If anyone gets idea please let me know.



from ViewBinding- not working for child layouts

No comments:

Post a Comment