2016-03-16 23 views
1

我在我的应用程序中使用了v7.widget.Toolbar,但我收到了一些时髦的功能。我有我的主要活动和放在它上面的碎片。当backStack上没有碎片时,汉堡按钮显示,菜单正常工作。当我向backStack添加一个片段时,上面的脱字符号正确显示,但是当单击上方的脱字符时,导航菜单将打开,而不是从堆栈弹出片段。工具栏的注意事项打开导航菜单

现在,如果有一个真正的答案,我会接受它,但在这一点上,我将采取hackish的解决方案。我尝试添加一个监听器,这样我知道何时按下了操作栏按钮,但这只是使得片段弹出,页面返回,但导航菜单仍然打开。 onOptionsItemSelected没有被调用(由于我实现抽屉切换的方式,但这样做“正确”的方式给了我更多的问题,比如根本没有导航菜单显示在主页上)。

概括起来为清楚:向上插入符打开导航菜单,而不是去背。

@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); 
} 

,下面和this hacky answer工作对我来说

亚历克斯“的回答的组合(包括他在回答评论)的解决方案。

回答

1

您可以使用setToolbarNavigationClickListener() - 它设置一个处理当点击抽屉指标是禁用听者

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

'mDrawerToggle.setToolbarNavigationClickListener(新View.OnClickListener(){ @覆盖 公共无效的onClick(视图v) { Log.d( “主”, “setToolbarNavClickListener”); getSupportFragmentManager()popBackStack();} });' 是我做的,但是它永远不会被调用。不要在主屏幕上使用正确的导航菜单或碎片深度屏幕上带有脱字符号。如果你使用'mDrawerToggle.setDrawerIndicatorEnabled(布尔)' –

+0

听众只能 - 试试这个,而不是'ab.setDisplayHomeAsUpEnabled(canback);' – Alex

+0

向上插入符号不显示某些页面上,但是当它做它工作正常。我会称之为进步。如果我找出如何让它显示在所有页面上,我会回复。我目前只有“setDrawerIndicatorEnabled()”方法,其中“setDisplayHomeAsUpEnabled()”是以前的。 –