android / android-ktx

A set of Kotlin extensions for Android app development.
https://android.github.io/android-ktx/core-ktx/
7.48k stars 565 forks source link

Add the ability to get the parent Activity of a View #593

Open gahfy opened 6 years ago

gahfy commented 6 years ago

Adding the ability to get the parent Activity of a View.

googlebot commented 6 years ago

Thanks for your pull request. It looks like this may be your first contribution to a Google open source project (if not, look below for help). Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

:memo: Please visit https://cla.developers.google.com/ to sign.

Once you've signed (or fixed any issues), please reply here (e.g. I signed it!) and we'll verify it.


What to do if you already signed the CLA

Individual signers
Corporate signers
gahfy commented 6 years ago

I signed it!

googlebot commented 6 years ago

CLAs look good, thanks!

gahfy commented 6 years ago

Need #582 to be merged otherwise CI won't pass

JakeWharton commented 6 years ago

Why do you need this? Accessing the activity from a view is a generally discouraged pattern as it creates a bad coupling that prevents reuse.

gahfy commented 6 years ago

@JakeWharton Most of the time, I use it in BindingAdapters in order to put the Observer process out of the Activity to avoid boilerplate code in Activity which is often the same. For example:

/**
 * Sets a mutable visibility to the View. When the value of the LiveData changes, the visibility of
 * the View will change as well.
 * @param view the View to which to set the mutableVisibility
 * @param visibility the visibility LiveData the View should observe
 */
@BindingAdapter("mutableVisibility")
fun setMutableVisibility(view: View, visibility: MutableLiveData<Int>?) {
    val parentActivity: AppCompatActivity? = view.getParentActivity()
    if(parentActivity != null && visibility != null) {
        visibility.observe(parentActivity, Observer { value -> view.visibility = value?: View.VISIBLE})
    }
}

Then all you have to do is to set app:mutableVisibility as attribute in XML, and you don't have to care about Observers in your Kotlin Activity.

gahfy commented 5 years ago

Rebased on #582 as it has been merged to let CI pass

gahfy commented 5 years ago

Does someone understand the error of instrumented tests and how to solve it?