我正在尝试在我的应用程序中设置正确的导航,这取代了主要内容区域中的Fragment
,因此我只有一个Activity
。我有一个主Fragment
和几个子Fragments
,例如Fragment
的首选项。使用后退按钮时一切正常,但我想实现包括图标在内的向上导航。我使用ActionBar
获取的Activity.getSupportActionBar()
以及来自appcompat的Toolbar
和ActionBarDrawerToggle
。
我在首先设置Drawer
时跟踪了this tutorial。
当前行为:
当我启动应用程序时,列表/抽屉图标显示在ActionBar
的左侧部分。点击此按钮后,Drawer
会打开,我可以选择项目。子Fragment
被替换为我的内容,后退按钮弹出堆栈,让我回到之前的Fragment
。
缺少行为
左上角的列表/抽屉图标永远不会被后退箭头图标取代,我无法弄清楚如何正确实现这一点。单击列表/抽屉图标时,Drawer
总是拉出来,无论我在哪Fragment
。
我尝试了什么:
Fragment
中,但单击后退箭头仍会打开Drawer
而不是提供导航。此外,当使用后退按钮“向上”时,列表/抽屉图标将被替换为任何内容。ActionBar
行为/外观在各种onCreate()
的{{1}}方法中实现。使用此功能,我可以向上箭头,但单击箭头时仍然会拉Fragment
。我的问题:
Drawer
,ActionBar
和Toolbar
与导航一起实施ActionBarDrawerToggle
导航是正确/正常吗?Drawer
@Override
protected void onCreate(Bundle savedInstanceState)
{
// Other stuff
// Setup drawer.
mDrawerFragment = (DrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.mm_navigation_drawer);
mDrawerFragment.initialize(this, (DrawerLayout)findViewById(R.id.mm_drawer_layout), toolbar);
}
接口public class DrawerFragment extends Fragment
{
private MyActivity mMyActivity;
private MyActionBarDrawerToggle mMyBarDrawerToggle;
private DrawerLayout mDrawerLayout;
private FragmentDrawerListener mFragmentDrawerListener;
private View mContainerView;
public void initialize(MyActivity myActivity, final DrawerLayout drawerLayout, final Toolbar toolbar)
{
mMyActivity = myActivity;
mFragmentDrawerListener = mMyActivity;
mContainerView = myActivity.findViewById(R.id.mm_navigation_drawer);
mMyActionBarDrawerToggle = new MyActionBarDrawerToggle(myActivity, drawerLayout, toolbar, R.string.mm_drawer_open, R.string.mm_drawer_close);
mDrawerLayout = drawerLayout;
mDrawerLayout.setDrawerListener(mMyActionBarDrawerToggle);
mDrawerLayout.post(new Runnable()
{
@Override
public void run()
{
mMyActionBarDrawerToggle.syncState();
}
});
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState)
{
// Not relevant, just create and return the View.
}
}
的实现是在FragmentDrawerListener
类中完成的。它只是使用MyActivity
s。
Fragment
FragmentTransaction
@Override
public void onDrawerItemSelected(View view, int postion)
{
switch (postion)
{
case DrawerAdapter.ITEM_FILTERED_RECIPES:
showFilteredRecipesFragment();
break;
case DrawerAdapter.ITEM_SELECTED_RECIPES:
showSelectedRecipesFragment();
break;
case DrawerAdapter.ITEM_SHOPPING_LIST:
showShoppingListFragment();
break;
case DrawerAdapter.ITEM_SETTINGS:
showSettingsFragment();
break;
case DrawerAdapter.ITEM_ABOUT:
showAboutFragment();
break;
}
}
使用一个简单的静态public class MyActionBarDrawerToggle extends ActionBarDrawerToggle
{
private MyActivity mMyActivity;
private Toolbar mToolbar;
public MyActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes)
{
super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes);
mMyActivity = (MyActivity) activity;
mToolbar = toolbar;
}
@Override
public void onDrawerOpened(View drawerView)
{
super.onDrawerOpened(drawerView);
mMyActivity.invalidateOptionsMenu();
}
@Override
public void onDrawerClosed(View drawerView)
{
super.onDrawerClosed(drawerView);
mMyActivity.invalidateOptionsMenu();
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset)
{
super.onDrawerSlide(drawerView, slideOffset);
mToolbar.setAlpha(1 - slideOffset / 2);
}
}
实例在主布局中对DrawerFragment
进行了充气:
Fragment
答案 0 :(得分:1)
如果您正在为您的应用程序使用材料设计,那么您应该使用Toolbar
替换活动中的Actionbar
。您仍将保留ActionBarDrawerToggle
,功能将保持不变。
至于你的碎片,只要它们被相同的活动“收纳”(即抽屉的活动),更换碎片就不会导致抽屉切换以改变后箭头。只有在导航到新活动时才会更改。只有这样,主要活动才会被视为家庭活动,其他活动会有后退箭头导航回来