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;
|
private boolean mTwoPane;
|
||||||
|
|
||||||
|
ViewPager mViewPager;
|
||||||
FragmentPagerAdapter mFragPagerAdapter;
|
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
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -49,24 +57,36 @@ public class AddressbookContainer extends Fragment
|
|||||||
// res/values-sw600dp). If this view is present, then the
|
// res/values-sw600dp). If this view is present, then the
|
||||||
// activity should be in two-pane mode.
|
// activity should be in two-pane mode.
|
||||||
mTwoPane = true;
|
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
|
// Set up the two pages
|
||||||
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
|
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
|
||||||
if (getChildFragmentManager().findFragmentById(R.id.left_fragment) == null)
|
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)
|
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();
|
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());
|
mFragPagerAdapter = new AddressbookPagerAdapter(getActivity(), getChildFragmentManager());
|
||||||
viewPager.setAdapter(mFragPagerAdapter);
|
mViewPager.setAdapter(mFragPagerAdapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AddressbookPagerAdapter extends FragmentPagerAdapter {
|
public class AddressbookPagerAdapter extends FragmentPagerAdapter {
|
||||||
private static final int NUM_ITEMS = 2;
|
private static final int NUM_ITEMS = 2;
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@ -84,10 +104,10 @@ public class AddressbookContainer extends Fragment
|
|||||||
@Override
|
@Override
|
||||||
public Fragment getItem(int position) {
|
public Fragment getItem(int position) {
|
||||||
switch (position) {
|
switch (position) {
|
||||||
case 0:
|
case FRAGMENT_ID_ROUTER:
|
||||||
return AddressbookFragment.newInstance(AddressbookFragment.ROUTER_BOOK);
|
return (mRouterFrag = AddressbookFragment.newInstance(AddressbookFragment.ROUTER_BOOK));
|
||||||
case 1:
|
case FRAGMENT_ID_PRIVATE:
|
||||||
return AddressbookFragment.newInstance(AddressbookFragment.PRIVATE_BOOK);
|
return (mPrivateFrag = AddressbookFragment.newInstance(AddressbookFragment.PRIVATE_BOOK));
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -116,6 +136,56 @@ public class AddressbookContainer extends Fragment
|
|||||||
searchView.setOnQueryTextListener(this);
|
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
|
// AddressbookFragment.OnAddressSelectedListener
|
||||||
|
|
||||||
public void onAddressSelected(CharSequence host) {
|
public void onAddressSelected(CharSequence host) {
|
||||||
|
Reference in New Issue
Block a user