9

Avevo un cassetto di navigazione standard, ma ora sto provando a modificarlo utilizzando la barra degli strumenti.La barra degli strumenti per il lecca-lecca Android passa tra il pulsante di apertura/chiusura e il pulsante posteriore

All'inizio il mio codice sembrava: MainActivity.java

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

    Log.v("MAIN", "CREATE"); 
    initViews(); 
    setListeners(); 

    getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      shouldDisplayHomeUp(); 
     } 
    }); 

    mNavigationDrawerFragment = (NavigationDrawerFragment) 
      getFragmentManager().findFragmentById(R.id.navigation_drawer); 
    mTitle = getTitle(); 

    // Set up the drawer. 
    mNavigationDrawerFragment.setUp(
      R.id.navigation_drawer, 
      (DrawerLayout) findViewById(R.id.drawer_layout)); 
} 

NavigationDrawerFragment.java

public void setUp(int fragmentId, DrawerLayout drawerLayout) { 
    mFragmentContainerView = getActivity().findViewById(fragmentId); 
    mDrawerLayout = drawerLayout; 

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

    ((MainActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    ((MainActivity) getActivity()).getSupportActionBar().setHomeButtonEnabled(true); 

    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, 
      ((MainActivity) getActivity()).getToolbar(), 
      R.string.navigation_drawer_open, 
      R.string.navigation_drawer_close) { 
     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      if (!isAdded()) { 
       return; 
      } 

      getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      if (!isAdded()) { 
       return; 
      } 

      if (!mUserLearnedDrawer) { 
       // The user manually opened the drawer; store this flag to prevent auto-showing 
       // the navigation drawer automatically in the future. 
       mUserLearnedDrawer = true; 
       SharedPreferences sp = PreferenceManager 
         .getDefaultSharedPreferences(getActivity()); 
       sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply(); 
      } 
      if (mDrawerListView != null) { 

      } 
      getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
     } 

     @Override 
     public void onDrawerSlide(View drawerView, float slideOffset) { 
      super.onDrawerSlide(drawerView, slideOffset); 
     } 
    }; 

    // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer, 
    // per the navigation drawer design guidelines. 
    if (!mUserLearnedDrawer && !mFromSavedInstanceState) { 
     mDrawerLayout.openDrawer(mFragmentContainerView); 
    } 

    // Defer code dependent on restoration of previous instance state. 

    mDrawerToggle.setDrawerIndicatorEnabled(true); 

    mDrawerLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      mDrawerToggle.syncState(); 
     } 
    }); 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
} 

Ora ho modificato il mio codice: MainActivity.java

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

    mToolbar = (Toolbar) findViewById(R.id.toolbar); 

    if (mToolbar != null) { 
     setSupportActionBar(mToolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    initViews(); 
    setListeners(); 

    mNavigationDrawerFragment = (NavigationDrawerFragment) 
      getFragmentManager().findFragmentById(R.id.navigation_drawer); 
    mTitle = getTitle(); 

    // Set up the drawer. 
    mNavigationDrawerFragment.setUp(
      R.id.navigation_drawer, 
      (DrawerLayout) findViewById(R.id.drawer_layout)); 


    shouldDisplayHomeUp(); 

    getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      mBackCount++; 
      shouldDisplayHomeUp(); 
     } 
    }); 
} 

NavigationDrawerFragment.java

public void setUp(int fragmentId, DrawerLayout drawerLayout) { 
    mFragmentContainerView = getActivity().findViewById(fragmentId); 
    mDrawerLayout = drawerLayout; 

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, 
      ((MainActivity) getActivity()).getToolbar(), 
      R.string.navigation_drawer_open, 
      R.string.navigation_drawer_close) { 
     @Override 
     public void onDrawerClosed(View drawerView) { 
      super.onDrawerClosed(drawerView); 
      if (!isAdded()) { 
       return; 
      } 

      getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      if (!isAdded()) { 
       return; 
      } 

      if (!mUserLearnedDrawer) { 
       // The user manually opened the drawer; store this flag to prevent auto-showing 
       // the navigation drawer automatically in the future. 
       mUserLearnedDrawer = true; 
       SharedPreferences sp = PreferenceManager 
         .getDefaultSharedPreferences(getActivity()); 
       sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply(); 
      } 
      if (mDrawerListView != null) { 

      } 
      getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
     } 

     @Override 
     public void onDrawerSlide(View drawerView, float slideOffset) { 
      super.onDrawerSlide(drawerView, slideOffset); 
     } 
    }; 

    // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer, 
    // per the navigation drawer design guidelines. 
    if (!mUserLearnedDrawer && !mFromSavedInstanceState) { 
     mDrawerLayout.openDrawer(mFragmentContainerView); 
    } 

    // Defer code dependent on restoration of previous instance state. 

    mDrawerToggle.setDrawerIndicatorEnabled(true); 

    mDrawerLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      mDrawerToggle.syncState(); 
     } 
    }); 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
} 

E shouldDisplayHomeUp funzione:

public void shouldDisplayHomeUp(){ 
    boolean canBack = getFragmentManager().getBackStackEntryCount() > 0; 
    mNavigationDrawerFragment.getDrawerToggle().setDrawerIndicatorEnabled(!canBack); 
} 

Ma la freccia indietro non è mostrato

ho provato chiamata

getSupportActionBar().setDisplayHomeAsUpEnabled(canBack); 
getSupportActionBar().setHomeButtonEnabled(canBack); 

Così la freccia indietro appers ma cliccando su di esso non ha alcun effetto

+0

Si desidera modificare la freccia indietro quando si dispone di più di un frammento sul backstack? –

+0

Sì, e fornire la navigazione indietro invece di aprire il cassetto – zagum

+0

con actionbar funziona perfettamente – zagum

risposta

21

Dalla documentazione:

per consentire fino navigazione con l'icona dell'applicazione nella barra delle azioni, chiamare setDisplayHomeAsUpEnabled():

@Override public void onCreate(Bundle savedInstanceState) { 
    ... 
    getActionBar().setDisplayHomeAsUpEnabled(true); } 

Questo aggiunge un accento circonflesso rivolta a sinistra accanto l'icona dell'app e abilita come azione il pulsante in modo tale che quando l'utente lo preme, l'attività riceve una chiamata su onOptionsItemSelected(). L'ID per l'azione è android.R.id.home.

Questo significa che si dovrà implementare la vostra routine di nuovo in onOptionsItemSelected e verificare la presenza di R.id.home. Per evitare di chiamare la routine quando si fa clic sul menu dell'hamburger, verificare canback anche su onOptionsItemSelected.

http://developer.android.com/training/implementing-navigation/ancestral.html#up

EDIT

di raggiungere un 'ciò che si desidera si dovrà implementare una propria routine di navigazione.

mToolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(shouldBack()) { 
       //call onbackpressed or something 
       if(displayBackAgain) 
        return; //return after so you don't call syncState();  
      }else if (mNavigationDrawerFragment.isDrawerOpen()) 
       mNavigationDrawerFragment.closeDrawer(); 
      else 
       mNavigationDrawerFragment.openDrawer(); 
      mNavigationDrawerFragment.getActionBarDrawerToggle().syncState(); 
     } 
    }); 
} 

Per abilitare l'icona BackButton basta chiamare getSupportActionBar().setDisplayHomeAsUpEnabled(true); per disattivarla basta chiamare mNavigationDrawerFragment.getActionBarDrawerToggle().syncState();

+2

sì, ma non funziona per la barra degli strumenti da appcompat_v21 – zagum

+1

I ' ho modificato la risposta –

+0

setNavigationOnClickListener non cattura gli eventi click – zagum

1

ho trovato un modo per controllare il pulsante indietro e il NAV. Ha funzionato con me. In primo luogo, impostare:

private void setupNav() { 

    this.toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(this.toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    this.mActionBarDrawerToggle = new ActionBarDrawerToggle(this, this.mDrawerLayout, this.toolbar, 0, 0); 

    this.mActionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //catch back button here. 
     } 
    }); 
    this.mDrawerLayout.setDrawerListener(this.mActionBarDrawerToggle); 
    this.mActionBarDrawerToggle.syncState(); 
} 

Cosa importante, questo è il modo in cui mi nascondo l'hamburger e mostrare il pulsante indietro. Devi mettere questo codice nel posto in cui vuoi mostrare il pulsante indietro. Mi blocco anche il Nav quando si mostra il pulsante indietro.

if (!isShowBackButton) { 
     mActionBarDrawerToggle.setDrawerIndicatorEnabled(true); 
     mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
    } else { 

     mActionBarDrawerToggle.setDrawerIndicatorEnabled(false); 
     mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     //enable back button 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 
Problemi correlati