工具栏的向上插入按钮打开导航菜单

时间:2016-03-16 15:57:49

标签: android android-fragments

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

现在,如果有真正的答案,我会接受它,但此时我会采取一种解决方案。我尝试添加一个监听器,所以我知道什么时候操作栏按钮被击中,但这只是弹出片段,页面返回,但导航菜单仍然打开。 onOptionsItemSelected没有被调用(由于我实现Drawer Toggle的方式,但是这样做&#34;纠正&#34;方式给了我更多的问题,例如主页上根本没有显示导航菜单。)< / p>

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

@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&#39;的结合在下面和this hacky answer回答(包括他在答案中的评论)。

1 个答案:

答案 0 :(得分:1)

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

drawerToggle.setToolbarNavigationClickListener((View view) -> {
        getSupportFragmentManager().popBackStack();
    });