当前位置: 首页 > 知识库问答 >
问题:

工具栏的上插入符号打开导航菜单

阎建德
2023-03-14

我在我的应用程序中使用v7.widget.工具栏,但是我得到了一些时髦的功能。我有我的主要活动和放置在它上面的片段。当backStack上没有片段时,汉堡按钮会显示,菜单也会正常工作。当我向backStack添加片段时,向上插入符号会正确显示,但是当我单击向上插入符号时,导航菜单会打开,而不是从堆栈中弹出片段。

现在,如果有一个真正的答案,我会接受它,但在这一点上,我将采取黑客式的解决方案。我尝试添加一个侦听器,这样我就知道什么时候点击了操作栏按钮,但这只是让它弹出片段,页面返回,但导航菜单仍然打开。onOptionsItemSselect没有被调用(由于我实现抽屉切换的方式,但以“正确”的方式执行它给我带来了更多的问题,例如主页上根本没有导航菜单显示)。

为了清晰起见,总结一下:上插入符号是打开导航菜单,而不是返回。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTitle = getTitle();
    toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object
    frameLayout = (FrameLayout) findViewById(R.id.frame_layout);
    setSupportActionBar(toolbar);

    //Listen for changes in the back stack
    getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            shouldDisplayHomeUp();
        }
    });

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerContent = findViewById(R.id.drawer_content);
    mDrawerList = (ListView) findViewById(R.id.drawer_list);

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
    mDrawerList.setAdapter(new DrawerListItemAdapter(DRAWER_ITEMS, getApplicationContext()));

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.openDrawer, R.string.closeDrawer) {

        public void onDrawerClosed(View view) {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            Log.d("Main", "Open Menu");
        }

    };
    mDrawerToggle.syncState();
    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

    @Override
public void onBackStackChanged() {
    shouldDisplayHomeUp();
}

public void shouldDisplayHomeUp(){
    //Enable Up button only if there are entries in the back stack
    boolean canback = getSupportFragmentManager().getBackStackEntryCount()>0;
    ActionBar ab = getSupportActionBar();
    if(ab != null){
        ab.setDisplayHomeAsUpEnabled(canback);
    }
    if(!canback){
        //App can crash as mDrawerToggle will be null when app launches
        try{
            mDrawerToggle.syncState();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    Log.d("Main", "shouldDisplayHomeUp");
}

@Override
public boolean onSupportNavigateUp() {
    //This method is called when the up button is pressed. Just the pop back stack.
    Log.d("Main", "Up carat pressed");
    getSupportFragmentManager().popBackStack();
    return true;
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggls
    mDrawerToggle.onConfigurationChanged(newConfig);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();
    Log.d("Main", "Menu item clicked: " + Integer.toString(item.getItemId()));
    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

对我有效的解决方案

下面是Alex的回答(包括他在回答中的评论)和这个粗鲁的回答的组合。

共有1个答案

申屠泳
2023-03-14

您可以使用setToolbarNavigationClickListener()-它设置当抽屉指示器被禁用时处理单击的侦听器

drawerToggle.setToolbarNavigationClickListener((View view) -> {
        getSupportFragmentManager().popBackStack();
    });
 类似资料:
  • 在向应用添加导航栏和工具栏之前,我们需要决定使用哪种布局。 Framework7在这方面很自由,有3种不同类型的导航栏/工具栏布局,它们对应着在页面/视图中的不同位置。 静态布局 静态布局可能是最少使用的布局。在这种情况下,导航栏和工具栏只是可以滚动的页面内容的一部分,每个页面都有它自己的导航栏和工具栏: <body> ... <div class="views"> <div cl

  • 这个章节,我们会创建状态栏、菜单和工具栏。菜单是一组位于菜单栏的命令。工具栏是应用的一些常用工具按钮。状态栏显示一些状态信息,通常在应用的底部。 主窗口 QMainWindow提供了主窗口的功能,使用它能创建一些简单的状态栏、工具栏和菜单栏。 主窗口是下面这些窗口的合称,所以教程在最下方。 状态栏 状态栏是用来显示应用的状态信息的组件。 #!/usr/bin/python3 # -*- codin

  • 这个章节,我们会创建状态栏、菜单和工具栏。菜单是一组位于菜单栏的命令。工具栏是应用的一些常用工具按钮。状态栏显示一些状态信息,通常在应用的底部。 主窗口 QMainWindow 提供了主窗口的功能,使用它能创建一些简单的状态栏、工具栏和菜单栏。 主窗口是下面这些窗口的合称,所以教程在最下方。 状态栏 状态栏是用来显示应用的状态信息的组件。 #!/usr/bin/python3 # -*- codi

  • 本文向大家介绍twitter-bootstrap 导航栏中的子菜单,包括了twitter-bootstrap 导航栏中的子菜单的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我正在尝试打开导航栏菜单,在悬停和焦点。这就是我所尝试的:但是在悬停状态下它工作得很好,但是在聚焦状态下菜单列表应该打开。 当屏幕阅读器使用键盘选项卡按钮时,我需要打开菜单列表,就像在悬停时打开一样。 JS: 小提琴链接:演示

  • 不久前,我有一个导航抽屉在工作,但后来我决定将其更新为使用工具栏,而不是默认的支持操作栏。现在,当我点击汉堡包菜单时,导航抽屉没有打开。然而,我可以从左向右滑动并打开它。问题是,它现在是空的。 值-v21/样式。xml 导航U抽屉。xml ctivity.java 我知道NavDrawerItem看起来有点不稳定,但我已经验证了它可以与旧的导航抽屉(前工具栏)一起工作,它真正做的是用图标填充列表视