Home > Software engineering >  How to reference a button from different view in Fragment. Kotlin
How to reference a button from different view in Fragment. Kotlin

Time:06-23

I want to achieve a simple task. I have an invisible button in one layout and a have a Fragment. When this function is executed I want the button in the other layout to become visible. However this layout with the button is not in the Fragment layout, which means I have to reference that button in the Fragment, but I don't know how to go about that.

enter image description here

This is what Fragment will look like to first time users. The images you see are in a recyclerview which inflates a layout. That layout has the invisible button.

Fragment class

 //item subscribed
    if (subscribeValueFromPref) {
        subscribeAbstract.visibility = View.GONE
        // abstractDownload.visibility = View.VISIBLE



    } else {
        subscribeAbstract.visibility = View.VISIBLE
        // abstractDownload.visibility = View.VISIBLE


    }
}

When this line of code executed the button in the fragment is gone and the button from the other layout becomes visible. As you can see I put two strokes in front of that code. Once the code has been executed the layout should look like this.

enter image description here

Summary

I want to reference a button in another layout from a fragment class.

CodePudding user response:

Do you even need to communicate between fragments? Your example looks like a single fragment with a subscribe button, and a RecyclerView that contains items which have a button that can be displayed or hidden. You can just make that part of your Adapter's state, like this:

class MyAdapter : RecyclerView.Adapter<ViewHolder>() {

    var showDownloadButtons = false
    set(value) {
        field = value
        // call this to update the display (calls onBindViewHolder for items)
        notifyDataSetChanged()
    }

    override fun onBindViewHolder(viewHolder: ViewHolder, position.Int) {
        ...
        // when displaying an item, show or hide the download button as appropriate
        viewHolder.downloadButton.visibility = if (showDownloadButtons) VISIBLE else INVISIBLE
    }

}

Then in your fragment, when you work out your UI state based on that subscription value, you can just handle your main button and tell the adapter what to display:

if (subscribeValueFromPref) {
    subscribeAbstract.visibility = View.GONE
    adapter.showDownloadButtons = true
} else {
    subscribeAbstract.visibility = View.VISIBLE
    adapter.showDownloadButtons = false
}
  • Related