2015-02-01 4 views
8

Ich vertausche die Aktionsleiste für die Symbolleiste, und ich habe fast jedes Teil des Puzzles an Ort und Stelle. Mein Problem ist speziell, wenn ich nach oben navigiere und die Navigationsleiste wiederherstelle, funktioniert die Umschalttaste nicht mehr. Ich habe herausgefunden, dass ich die Schublade öffnen kann, wenn ich den Schubladenmodus auf "entriegelt" stelle, aber ich kann nicht klicken, um die Schublade zu öffnen.Toolbar setNavigationOnClickListener bricht ActionbarDrawerToggle Funktionalität

Also ich lade Fragment A, Schublade Verhalten ist in Ordnung, gehen Sie zu Fragment B und wenden Sie das Symbol hoch, drücken Sie hoch, um zurück zu A, und die Schublade wird nicht mit einem Klick mehr öffnen.

Anfang Fragment 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); 
    } 
} 

Die Navigationsleiste ist ebenso wie die Probe aufgebaut, vielleicht die alte Art und Weise der Einstellung der Optionen nach oben ist das Problem? Zum Beispiel habe ich noch in meinem Aktivität:

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

    return super.onOptionsItemSelected(item); 
} 

EDIT:

Okay, so habe ich das Problem mit dem setNavigationOnClickListener verengt(). Wenn ich das nicht einstelle (und über die Zurück-Taste nach oben gehe) - verhält sich die Schublade korrekt. Die Frage ist nun, wie kann ich dem Benutzer richtig erlauben, nach oben zu gehen, und den Klick-Listener wiederherstellen, nachdem wir nach oben gegangen sind?

Antwort

13

Also habe ich herausgefunden, dass ich den falschen Klick Listener erstellt habe. Statt setNavigationOnClickListener(), ich brauche setToolbarNavigationClickListener() :)

Eine subtile, aber wichtige Änderung, jetzt die Werkzeugleiste wird in Partnerschaft mit dem 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

Ich wollte nur eine kurze Notiz hinzufügen, ich habe festgestellt, onOptionsAltAusgewählt ist nicht in Fragmenten gefeuert, scheint aber gut für Aktivitäten - wo Der Standard android.R.id.home Check kann gemacht werden –

+0

Danke. Ich habe gerade Ihre Lösung in eine [einfachere] geändert (http://stackoverflow.com/a/30951016/1276636). – Sufian

+0

sehr sehr sehr sehr danke :) –

0

Ich glaube, Sie nicht verwenden können:

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

, weil es Ihre normale Navigationsleiste Verhalten brechen.

Stattdessen versuchen Sie so etwas wie dies in onCreateOptionsMenu (Menü Menü MenuInflater inflater):

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

und dann 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: vergessen Sie nicht, setHasOptionsMenu (true) zu verwenden; in Ihrem Fragment onCreateView.

+0

Hallo Daniel, danke für die Eingabe, das ist eigentlich so, wie es ursprünglich war. Mehrere SO-Fragen scheinen auf die Tatsache hingewiesen zu haben, dass R.id.home nicht mehr gefeuert wird, wenn Sie eine Werkzeugleiste verwenden, was eine Schande ist. Ich denke jetzt, ich muss jeden Verweis auf die Aktion Leiste Schublade wechseln und Trigger Schublade öffnen mit einem Navigations Klick Listener in der Aktivität entfernen –

+1

Hallo, das ist seltsam, weil in meinem Projekt verwende ich Symbolleiste und android.R. id.home wird normalerweise ausgelöst, wenn ich auf das Pfeilsymbol klicke. Aber ich kann sehen, dass Sie eine andere Lösung gefunden haben, vielleicht werde ich nächstes Mal inspiriert werden :) – Daniel

5

Inspiriert durch die Lösung von Daniel Wilson verhalten aber Sie müssen es nur einmal tun und es ist alles eingestellt.

In meinem NavigationDrawer ‚s setUp() (oder Sie können es überall Sie Ihre ActionBarDrawerToggle Instanz initialisiert), schreibe ich diesen Code:

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

Jetzt android.id.home jedes Mal gedrückt wird und Hamburger Zeichen nicht angezeigt wird, Die onBackPressed() der übergeordneten Aktivität wird aufgerufen.

6

In meinem Fall war es eine Frage der Reihenfolge, ich musste zuerst die Symbolleiste und dann den On-Click-Listener setzen.in dieser Reihenfolge:

 //works 
    setSupportActionBar(myToolbar); 

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

eher als das:

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

So animieren wir verwenden können.

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

Aktion 0 für HAMBURGER-Symbol und 1 für BACK übergeben.

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(); 
     } 
    } 
} 
Verwandte Themen