android-tvleanback

Persistent header fragment (disable animation) in Android TV (leanback)


Anyone knows how to achieve the question in the title? The objective is to avoid the animation that results in the Headers bar disappearing as the Leanback app zooms in on the Row Item once a Header has been clicked.

setHeadersState of BrowseSupportFragment doesn't help. Perhaps something to do with hijacking startHeadersTransitionInternal during OnHeaderClickedListener? If so, any idea how to correctly implement it?


Solution

  • So the problem with this one is that the transition is handled by the method startHeadersTransitionInternal which is package private. Because of this, you can't override it in most situations. However, since it's only package private and not private private, there's a little hack around this that you can do.

    First, make a package in your app with the same package name as BrowseSupportFragment. Then make a class in that package that extends BrowseSupportFragment and override the offending method with no implementation. That'd look something like this:

    package android.support.v17.leanback.app; // Different for AndroidX
    
    public class HackyBrowseSupportFragment extends BrowseSupportFragment {
    
        @Override
        void startHeadersTransitionInternal(boolean withHeaders) {
            // Do nothing. This avoids the transition.
        }
    }
    

    Then, instead of extending BrowseSupportFragment, you'd extend HackyBrowseSupportFragment.

    One thing to note that I found with this is that the back button will no longer refocus the headers from one of the rows, so you'll have to do that manually. Other than that, seems to work just fine.