Store AddressbookFragment references, use to propagate visibility hints
This commit is contained in:
@ -31,8 +31,16 @@ public class AddressbookContainer extends Fragment
|
||||
*/
|
||||
private boolean mTwoPane;
|
||||
|
||||
ViewPager mViewPager;
|
||||
FragmentPagerAdapter mFragPagerAdapter;
|
||||
|
||||
private static final String FRAGMENT_ROUTER = "router_fragment";
|
||||
private static final String FRAGMENT_PRIVATE = "private_fragment";
|
||||
private static final int FRAGMENT_ID_ROUTER = 0;
|
||||
private static final int FRAGMENT_ID_PRIVATE = 1;
|
||||
AddressbookFragment mRouterFrag;
|
||||
AddressbookFragment mPrivateFrag;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
@ -49,24 +57,36 @@ public class AddressbookContainer extends Fragment
|
||||
// res/values-sw600dp). If this view is present, then the
|
||||
// activity should be in two-pane mode.
|
||||
mTwoPane = true;
|
||||
}
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
mRouterFrag = (AddressbookFragment) getChildFragmentManager().getFragment(
|
||||
savedInstanceState, FRAGMENT_ROUTER);
|
||||
mPrivateFrag = (AddressbookFragment) getChildFragmentManager().getFragment(
|
||||
savedInstanceState, FRAGMENT_PRIVATE);
|
||||
} else if (mTwoPane) {
|
||||
mRouterFrag = AddressbookFragment.newInstance(AddressbookFragment.ROUTER_BOOK);
|
||||
mPrivateFrag = AddressbookFragment.newInstance(AddressbookFragment.PRIVATE_BOOK);
|
||||
|
||||
// Set up the two pages
|
||||
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
|
||||
if (getChildFragmentManager().findFragmentById(R.id.left_fragment) == null)
|
||||
ft.add(R.id.left_fragment, AddressbookFragment.newInstance(AddressbookFragment.ROUTER_BOOK));
|
||||
ft.add(R.id.left_fragment, mRouterFrag);
|
||||
if (getChildFragmentManager().findFragmentById(R.id.right_fragment) == null)
|
||||
ft.add(R.id.right_fragment, AddressbookFragment.newInstance(AddressbookFragment.PRIVATE_BOOK));
|
||||
ft.add(R.id.right_fragment, mPrivateFrag);
|
||||
ft.commit();
|
||||
} else {
|
||||
ViewPager viewPager = (ViewPager) v.findViewById(R.id.pager);
|
||||
}
|
||||
|
||||
if (!mTwoPane) {
|
||||
mViewPager = (ViewPager) v.findViewById(R.id.pager);
|
||||
mFragPagerAdapter = new AddressbookPagerAdapter(getActivity(), getChildFragmentManager());
|
||||
viewPager.setAdapter(mFragPagerAdapter);
|
||||
mViewPager.setAdapter(mFragPagerAdapter);
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
public static class AddressbookPagerAdapter extends FragmentPagerAdapter {
|
||||
public class AddressbookPagerAdapter extends FragmentPagerAdapter {
|
||||
private static final int NUM_ITEMS = 2;
|
||||
|
||||
private Context mContext;
|
||||
@ -84,10 +104,10 @@ public class AddressbookContainer extends Fragment
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
switch (position) {
|
||||
case 0:
|
||||
return AddressbookFragment.newInstance(AddressbookFragment.ROUTER_BOOK);
|
||||
case 1:
|
||||
return AddressbookFragment.newInstance(AddressbookFragment.PRIVATE_BOOK);
|
||||
case FRAGMENT_ID_ROUTER:
|
||||
return (mRouterFrag = AddressbookFragment.newInstance(AddressbookFragment.ROUTER_BOOK));
|
||||
case FRAGMENT_ID_PRIVATE:
|
||||
return (mPrivateFrag = AddressbookFragment.newInstance(AddressbookFragment.PRIVATE_BOOK));
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
@ -116,6 +136,56 @@ public class AddressbookContainer extends Fragment
|
||||
searchView.setOnQueryTextListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMenuVisibility(boolean menuVisible) {
|
||||
super.setMenuVisibility(menuVisible);
|
||||
|
||||
setChildMenuVisibility(mRouterFrag, FRAGMENT_ID_ROUTER, menuVisible);
|
||||
setChildMenuVisibility(mPrivateFrag, FRAGMENT_ID_PRIVATE, menuVisible);
|
||||
}
|
||||
|
||||
private void setChildMenuVisibility(Fragment fragment, int itemNumber, boolean menuVisible) {
|
||||
if (fragment != null) {
|
||||
if (mViewPager != null)
|
||||
menuVisible = menuVisible && mViewPager.getCurrentItem() == itemNumber;
|
||||
fragment.setMenuVisibility(menuVisible);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||
super.setUserVisibleHint(isVisibleToUser);
|
||||
|
||||
setChildUserVisibleHint(mRouterFrag, FRAGMENT_ID_ROUTER, isVisibleToUser);
|
||||
setChildUserVisibleHint(mPrivateFrag, FRAGMENT_ID_PRIVATE, isVisibleToUser);
|
||||
}
|
||||
|
||||
private void setChildUserVisibleHint(Fragment fragment, int itemNumber, boolean isVisibleToUser) {
|
||||
if (fragment != null) {
|
||||
if (mViewPager != null)
|
||||
isVisibleToUser = isVisibleToUser && mViewPager.getCurrentItem() == itemNumber;
|
||||
fragment.setUserVisibleHint(isVisibleToUser);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
|
||||
// Since the pager fragments don't have known tags or IDs, the only way to persist the
|
||||
// reference is to use putFragment/getFragment. Remember, we're not persisting the exact
|
||||
// Fragment instance. This mechanism simply gives us a way to persist access to the
|
||||
// 'current' fragment instance for the given fragment (which changes across orientation
|
||||
// changes).
|
||||
//
|
||||
// The outcome of all this is that the "Refresh" menu button refreshes the stream across
|
||||
// orientation changes.
|
||||
if (mRouterFrag != null)
|
||||
getChildFragmentManager().putFragment(outState, FRAGMENT_ROUTER, mRouterFrag);
|
||||
if (mPrivateFrag != null)
|
||||
getChildFragmentManager().putFragment(outState, FRAGMENT_PRIVATE, mPrivateFrag);
|
||||
}
|
||||
|
||||
// AddressbookFragment.OnAddressSelectedListener
|
||||
|
||||
public void onAddressSelected(CharSequence host) {
|
||||
|
Reference in New Issue
Block a user