Getting reference to nested fragment from FragmentTabHost

后端 未结 4 509
走了就别回头了
走了就别回头了 2021-02-07 05:11

In my application, I use an Activity which holds one Fragment with FragmentTabHost and hence all its tabs are nested Fragments

相关标签:
4条回答
  • 2021-02-07 05:45

    I was trying this for a while, but I was getting null returned from the FragmentManager because I was trying to access the manager in onCreateView() immediately after adding.

    Here is a good explanation on what happened

    It's also important to note that Fragment tabs that have not yet been selected don't exist yet in the FragmentManager, and so will return null as well. I got around this by calling mTabHost.setCurrentTab(index) before trying get to the Fragment with the FragmentManager. It's not very clean, but it works.

    0 讨论(0)
  • 2021-02-07 05:49

    Well, exploring the source code of FragmentTabHost I've found that when it adds a fragment tab, it assignes a tag of TabSpec to nested Fragment.

    So to get the reference to this Fragment we should call

    getChildFragmentManager().findFragmentByTag(tabSpecTag)

    0 讨论(0)
  • 2021-02-07 05:50

    I found a solution that I like a little better because it doesn't involving executing code with a delay (which is always iffy given android hardware fragmentation and different processor speeds).

    In your onTabChanged() method, before you try to find the fragment, call executePendingTransactions() on the fragment manager associated with your tabHost. It seems there are some places in the FragmentTabHost source code where they should be calling executePendingTransactions() but fail to do so.

    This works every time the tab changes with one exception... the first tab that is selected still comes back null... In my specific case, I was able to handle this exception differently anyway, by putting some code in onResume.

    Hope this helps.

    0 讨论(0)
  • 2021-02-07 05:58

    Above solutions are also working but I have one more easy solution,

     @Override
    public void onTabChanged(final String tabId) {
    
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
    
                mFragment = getChildFragmentManager().findFragmentByTag("Tagname");
            }
        },1000);
    }
    

    Here you have to implement FragmentTabHost.onTabChangeListener We have kept a second delay in fetching fragment from the childFragmentManager.

    Note : You need to cast mFragment which fragment you have used.

    0 讨论(0)
提交回复
热议问题