Android 具有多个片段的单个活动应用程序未显示向上导航

Android 具有多个片段的单个活动应用程序未显示向上导航,android,android-navigation,Android,Android Navigation,我有一个android应用程序,它有一个单一的主活动,使用许多片段切换到视图中。我不确定这样做是否正确,但我继承了这个项目,并希望避免进行任何重大重构,如将片段更改为所有活动或类似的事情 根据android文档,调用setDisplayHomeAsUp(bool)函数在默认情况下应该只显示向上按钮: 设置主屏幕是否应显示为“向上”显示。设定这个 如果在UI中选择“主页”返回单个级别,则为true 而不是回到顶层或头版 主要问题是,当我使用该功能时: actionBar.setDisplayHom

我有一个android应用程序,它有一个单一的主活动,使用许多片段切换到视图中。我不确定这样做是否正确,但我继承了这个项目,并希望避免进行任何重大重构,如将片段更改为所有活动或类似的事情

根据android文档,调用setDisplayHomeAsUp(bool)函数在默认情况下应该只显示向上按钮:

设置主屏幕是否应显示为“向上”显示。设定这个 如果在UI中选择“主页”返回单个级别,则为true 而不是回到顶层或头版

主要问题是,当我使用该功能时:

actionBar.setDisplayHomeAsUpEnabled(true);
它不会将打开导航抽屉的按钮设置为“向上”按钮。它只是从侧面移除了“汉堡包”ic_抽屉图标。导航抽屉仍然打开

以下是NavigationDrawerFragment的自定义代码(我复制并粘贴了在android studio中使用导航抽屉创建新应用程序时获得的确切文件):

NavigationDrawerFragment.java

这就是允许我在单个区域中更改操作栏上的标题,并设置默认情况下是否应设置“后退”按钮

MainActivity.java

附加的公共无效部分(android.app.Fragment片段){ Class fragmentType=fragment.getClass()


标题设置工作正常,调用setDisplayHomeAsUpEnabled(true)时没有错误,但它仍然没有显示“向上”按钮。我知道目前我没有设置除addToBackStack(null)之外的任何类型的片段导航层次结构调用片段事务,但这段代码似乎仍然足以让向上按钮取代导航抽屉按钮。

问题在于导航抽屉图标劫持了向上指示器。就操作栏中显示图标的视图而言,导航抽屉图标也是向上图标。这就是原因您需要调用
actionBar.setDisplayHomeAsUpEnabled(true);
以显示导航抽屉图标

要解决此问题,您需要使用。这将用向上图标替换导航抽屉图标。此方法的文档中有:

当指示器被禁用时,ActionBar将恢复为在android.R.attr.homeAsUpIndicator属性中显示活动主题提供的home as up指示器,而不是动画抽屉图示符


我遇到了与您相同的问题,我很难获得一致的向上箭头行为。我制作此示例是为了演示如何正确地使用带有导航抽屉和多个级别的单个活动


您正在测试哪种api?您是指SDK吗?我们的目标是SDK v.17+Hey@tanis,不久前您在这方面帮助了我-我在从支持设计库实现导航视图时遇到了完全相同的问题…如果您看看我的问题,我想您可能有一些见解?我完全被难住了。正在调用
SetDrainerIndicatorEnabled(假)
不再为你工作了?它现在为我工作。当我调用它时,它完全隐藏了工具栏上的按钮。当抽屉指示器被禁用时,你是否尝试调用以指定要使用的资源而不是默认资源?哈。在发布问题之前,我花了两天时间试图解决这个问题。如果你在我的q上发布从昨天开始,我将把它标记为已接受。再次非常感谢。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);

    mDrawerListView = (ListView) inflater.inflate(
            R.layout.fragment_navigation_drawer, container, false);
    mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItem(position);
        }
    });

    PopulateAppDrawerList();
    return mDrawerListView;
}

public void PopulateAppDrawerList() {
    List<AppOption> allApps = getAllApps();
    List<AppOption> filteredApps = new ArrayList<AppOption>();

    for (int i = 0; i < allApps.size(); i++) {
        if (allApps.get(i).getLaunchable()) {
            filteredApps.add(allApps.get(i));
        }
    }


    NavDrawerListAdapter adapter = new NavDrawerListAdapter(filteredApps, MainActivity.getInstance());
    mDrawerListView.setAdapter(adapter);
    mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
}
@Override
public void onStart() {
    super.onStart();

    MainActivity.getInstance().onSectionAttached(this);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
} }
    ActionBar actionBar = getActionBar();

    mNavigationDrawerFragment.PopulateAppDrawerList();
    if (fragmentType != null) {
        if (fragmentType.equals(AuthenticationFragment.class)) {
            actionBar.setDisplayHomeAsUpEnabled(false);
            mTitle = "Login";
        } else if (fragmentType.equals(MyOptionsFragment.class)) {
            actionBar.setDisplayHomeAsUpEnabled(false);
            mTitle = "My Options";
        } else if (fragmentType.equals(GLAuthenticationFragment.class)) {
            actionBar.setDisplayHomeAsUpEnabled(false);
            mTitle = "Login";
        } else if (fragmentType.equals(InitialLoginFragment.class)) {
            actionBar.setDisplayHomeAsUpEnabled(false);
            mTitle = "Login";
        } else if (fragmentType.equals(LoginFragment.class)) {
            actionBar.setDisplayHomeAsUpEnabled(false);
            mTitle = "Login";
        } else if (fragmentType.equals(DailyOverviewFragment.class)) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            mTitle = "Overview";
        } else if (fragmentType.equals(SingleComponentFragment.class)) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            SingleComponentFragment singleComponentFragment = (SingleComponentFragment) fragment;

            if (singleComponentFragment != null && singleComponentFragment .mComponent != null) {
                mTitle = String.format("Back To Day %s", singleComponentFragment.mComponent.getDay() + "");
            }
            else {
                mTitle = "";
            }
        } else if (fragmentType.equals(singleDayOverviewFragment.class)) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            mTitle = "Back To Overview";
        } 
    }

    actionBar.setTitle(mTitle);
}