2015-02-01 18 views
8

Sto scambiando la barra delle azioni per la barra degli strumenti e ho quasi tutti i pezzi del puzzle. Il mio problema è in particolare se si naviga su "su" e si ripristina il cassetto di navigazione, il pulsante di attivazione del cassetto non funziona più. Ho capito se ho impostato la modalità cassetto per sbloccato ho la possibilità di scorrere per aprire il cassetto, ma non posso fare clic per aprire il cassetto.Set di barre degli strumentiNavigationOnClickListener si interrompe ActionbarDrawerToggle funzionalità

Quindi carico il frammento A, il comportamento del cassetto va bene, vai al frammento B e apri l'icona su, premi su per tornare ad A, e il cassetto non si apre più con un clic.

Entrare frammento B:

Toolbar t = mHostingActivity.getToolbar(); 
     mHostingActivity.getDrawerToggle().setDrawerIndicatorEnabled(false); 
     mHostingActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     t.setNavigationIcon(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator()); 
     t.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       popBackStackToTop(mHostingActivity); 
      } 
     }); 

/** 
* Pop the back stack and hide the Up caret all the way to the top level of the {@link com.loylap.activities.MainActivity} 
* 
* @param activity our hosting activity 
*/ 
public static void popBackStackToTop(MainActivity activity) { 
    if (activity != null) { 
     FragmentManager fm = activity.getSupportFragmentManager(); 
     fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     activity.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
     activity.getDrawerToggle().setDrawerIndicatorEnabled(true); 
    } 
} 

Il cassetto di navigazione è impostato proprio come il campione, forse il vecchio modo di impostare le opzioni è il problema? Per esempio, ho ancora questo nella mia attività:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

EDIT:

Va bene così Ho ridotto la questione al setNavigationOnClickListener(). Se non lo imposto (e salgo sul pulsante Indietro), il cassetto si comporta correttamente. Quindi ora la domanda è: come faccio a consentire all'utente di andare "su", e ripristinare il listener dei clic dopo che saliamo?

risposta

13

Quindi ho capito che stavo creando un click listener sbagliato. Invece di setNavigationOnClickListener(), ho bisogno di setToolbarNavigationClickListener() :)

Un cambiamento sottile ma importante, ora la barra degli strumenti si sta comportando in collaborazione con la v7 ActionBarDrawerToggle

/** 
* Create the Up caret for a lower level fragment {@link com.loylap.activities.MainActivity} 
* 
* @param activity our hosting activity 
*/ 
public static void createUpButton(final MainActivity activity) 
{ 
    ActionBarDrawerToggle toggle = activity.getDrawerToggle(); 
    //Disables onClick toggle listener (onClick) 
    toggle.setDrawerIndicatorEnabled(false); 
    toggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      popBackStackToTop(activity); 
     } 
    }); 

    Toolbar t = activity.getToolbar(); 
    t.setNavigationIcon(activity.getV7DrawerToggleDelegate().getThemeUpIndicator()); 
    activity.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
} 
+0

Volevo solo aggiungere una breve nota a questo, ho notato che onOptionsItemSelected non è sparato in frammenti, ma sembra bene per le attività - dove il controllo standard Android.R.id.home può essere effettuato –

+0

Grazie. Ho appena modificato la tua soluzione in una [più semplice] (http://stackoverflow.com/a/30951016/1276636). – Sufian

+0

molto molto molto molto, grazie :) –

0

penso che non è possibile utilizzare:

 t.setNavigationIcon(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator()); 
    t.setNavigationOnClickListener(new View.OnClickListener() ... 

perché si romperà il tuo comportamento normale cassetto di navigazione.

Invece provare qualcosa di simile a onCreateOptionsMenu (menu Menu, MenuInflater gonfiatore):

mHostingActivity.getDrawerToggle().setDrawerIndicatorEnabled(false); 
mHostingActivity.getDrawerToggle().setHomeAsUpIndicator(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator()); 

e poi in onOptionsItemSelected

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     popBackStackToTop(mHostingActivity); 
     return true; 

    default: 
     break; 
    } 
    return false; 
} 

PS: non dimenticate di utilizzare setHasOptionsMenu (true); nel tuo frammento suCreateView.

+0

Ciao Daniel, grazie per l'input, questo è in realtà il modo in cui era in origine. Diverse domande di SO sembrano aver fatto riferimento al fatto che R.id.home non viene più licenziato se si utilizza una barra degli strumenti che è un peccato. Sto pensando ora ho bisogno di rimuovere qualsiasi riferimento al cassetto della barra azioni e attivare l'apertura del cassetto con un ascoltatore di click di navigazione nell'attività –

+1

Ciao, è strano, perché nel mio progetto sto usando la barra degli strumenti e Android.R. id.home viene normalmente attivato quando faccio clic sull'icona della freccia. Ma posso vedere che hai trovato un'altra soluzione quindi forse la prossima volta mi ispirerò :) – Daniel

5

Ispirato dalla soluzione di Daniel Wilson ma devi solo farlo una volta ed è tutto pronto.

in S' setUp() miei NavigationDrawer (o si può fare ovunque si sta inizializzazione l'istanza ActionBarDrawerToggle), scrivo questo codice:

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if(!mDrawerToggle.isDrawerIndicatorEnabled()) { 
      getActivity().onBackPressed(); 
     } 
    } 
}); 

Ora ogni volta android.id.home è premuto e segno hamburger non è mostrata, viene chiamato l'onBackPressed() dell'attività principale.

6

Nel mio caso era una questione di ordine, avevo bisogno di prima impostare la barra degli strumenti e di impostare il listener in clic.in questo ordine:

 //works 
    setSupportActionBar(myToolbar); 

    myToolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      openDrawer(view); 
     } 
    }); 

piuttosto che questo:

//doesn't work 
    myToolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      openDrawer(view); 
     } 
    }); 
    setSupportActionBar(myToolbar); 
0

Per animare possiamo usare.

ValueAnimator drawerAnimator = ValueAnimator.ofFloat(Constants.HAMBURGER, Constants.BACK); 
drawerAnimator.addUpdateListener(drawerAnimationUpdateListener); 
drawerAnimator.setDuration(Constants.DRAWER_ANIMATION_DURATION); 
drawerAnimator.setInterpolator(new LinearInterpolator()); 

passaggio azione 0 per icona HAMBURGER e 1 per BACK.

public void updateNavigationDrawer(int action) { 
    drawerArrowDrawable = actionBarDrawerToggle.getDrawerArrowDrawable(); 
    if (action == Constants.BACK) { 
     actionBarDrawerToggle.setDrawerIndicatorEnabled(false); 
     actionBarDrawerToggle.setHomeAsUpIndicator(drawerArrowDrawable); 
     actionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //onBackPress(); 
      } 
     }); 
     drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);); 
    } else { 
     actionBarDrawerToggle.setDrawerIndicatorEnabled(true); 
     drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
    } 
    if (drawerArrowDrawable.getProgress() != action) { 
     if (action == Constants.BACK) { 
      drawerAnimator.start(); 
     } else { 
      drawerAnimator.reverse(); 
     } 
    } 
} 
Problemi correlati