My use case:
I have an activity with a ViewPager
as its only view element, set up with three Fragment
s for its three pages (using a FragmentPagerAdapter
). One of these fragments is a ListFragment
, while the other two regular Fragment
s containing some infographics.
The list in the ListFragment
allows "checking" elements, and checking elements brings up the contextual action bar, presenting a list of actions possible on the selected/checked items.
My problem:
When I select a couple of list items, the CAB shows up. But when I switch pages, the CAB stays visible, presenting the actions. To make matters worse, the ViewPager
seems to sometimes destroy the view of the list fragment - hence selecting the actions throws a "java.lang.IllegalStateException: Content view not yet created"
exception.
My questions:
- How do I get the CAB to disappear when the user moves away from the
ListFragment
page? - (optional) How do I get the CAB to reappear when the
ListFragment
back is and some items are still checked.
You need to first add a ViewPager.OnPageChangeListener
with ViewPager.OnPageChangeListener
to your viewPager
.
In the onPageSelected method call a method in your ListFragment
to dismiss your CAB.
EDIT:
To get the current active fragment you can use it's tag. The tag can be computated with this method:
private static String makeFragmentName(int viewId, int index) {
return "android:switcher:" + viewId + ":" + index;
}
where viewId is the id of the viewpager and index the tab index (position)
You can also react to the fragment being hidden from inside the fragment by using the method setUserVisibleHint, as explained in https://stackoverflow.com/a/11075663/1199911
来源:https://stackoverflow.com/questions/15019289/hiding-showing-the-contextual-action-bar-programmatically