2016-03-16 27 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()」是以前的。 –