1

Ich verwende das ActionBarDrawerToggle mit NavigationView. Mein Inhalt wird mit Fragmenten angezeigt.ActionBarDrawerToggle mit AppCompatActivity und Toolbar Zurück-Schaltfläche mit Fragmenten

Ich bin auf this stackoverflow question folgen, um die Zurück-Taste drücken, um zu arbeiten, aber die Kontrolle fließt nie zu onOptionsItemSelected.

Das ist mein MainActivity.class:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes); 
    mDrawerLayout.addDrawerListener(mDrawerToggle); 
    mDrawerToggle.syncState(); 

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() == 0) { 
     super.onBackPressed(); 
    } else { 
     removeFragmentFromBackstack(); 
     updateToolbarWithHomeButton(); 
    } 

} 

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

    switch (item.getItemId()) { 
     case android.R.id.home: 
      // doesn't reach here ever. 
      return true; 
     case R.id.action_x: 
      // do something 
      return true; 
     case R.id.action_y: 
      // do something 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

@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); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

private void updateToolbarWithBackButton() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (null != mDrawerToggle && null != actionBar) { 
     mDrawerToggle.setDrawerIndicatorEnabled(false); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
} 

private void updateToolbarWithHomeButton() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (null != mDrawerToggle && null != actionBar) { 
     actionBar.setDisplayHomeAsUpEnabled(false); 
     mDrawerToggle.setDrawerIndicatorEnabled(true); 
     mDrawerToggle.syncState(); 
    } 
} 

Wie kann ich die Zurück-Taste erfassen <- Klick von Toolbar?


Update:

Dank der Zurück-Pfeil-Taste auf der Symbolleiste @ Mike jetzt im onOptionsItemSelected in meinem MainActivity Code erfaßt wird, wie unten aktualisiert.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes); 
    mDrawerLayout.addDrawerListener(mDrawerToggle); 
    mDrawerToggle.syncState(); 

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() == 0) { 
     super.onBackPressed(); 
    } else { 
     removeFragmentFromBackstack(); 
     updateToolbarWithHomeButton(); 
    } 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      //TODO: skip back press if fragment backstack count is 0. 
      onBackPressed(); 
      updateToolbarWithHomeButton(); 
      return true; 
     case R.id.action_x: 
      // do something 
      return true; 
     case R.id.action_y: 
      // do something 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

@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); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

private void updateToolbarWithBackButton() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (null != mDrawerToggle && null != actionBar) { 
     mDrawerToggle.setDrawerIndicatorEnabled(false); 
    } 
} 

private void updateToolbarWithHomeButton() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (null != mDrawerToggle && null != actionBar) { 
     mDrawerToggle.setDrawerIndicatorEnabled(true); 
     mDrawerToggle.syncState(); 
    } 
} 

Antwort

1

Wenn Sie die onOptionsItemSelected() Methode beim Anklicken der Toggle abzufeuern möchten, entfernen Sie das toolbar Argument vom ActionBarDrawerToggle Konstruktoraufruf.

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
    R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes); 

Andernfalls wird die Knebelgriffe Öffnen und Schließen der Schublade intern, und der Anruf an ActionBarDrawerToggle#onOptionsItemSelected() ist nicht erforderlich.

Wenn Sie das Home Button je nach aktuellem Status anders handhaben möchten, sollten Sie auch den Block if entfernen, der am Anfang der Methode onOptionsItemSelected() zurückkehrt.

Und Sie sollten setDisplayHomeAsUpEnabled(true) nur einmal in onCreate() anrufen. Sie müssen das nicht ständig an- und ausschalten. Aktivieren und Deaktivieren der Schubladenanzeige wird dafür sorgen.

+0

aussehen (dies, mDrawerLayout, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes); aber der Switch-Fall für MenuItem mit ID android.R.id.home wird nicht bestanden. Gibt es eine andere ID für den Zurück-Button? –

+0

Der Aufruf von 'mDrawerToggle.onOptionsItemSelected (Element)' gibt 'true' zurück, wenn die' MenuItem'-ID 'android.R.id.home' ist, so dass' if' Block zurückkehrt, bevor die Ausführung Ihren 'switch' erreicht . Sie können diesen Anruf einfach in Ihren ersten Fall verschieben. –

+0

Ich habe eine Log-Anweisung in den 'if'-Block hinzugefügt, aber es gibt nicht wahr für' mDrawerToggle.onOptionsItemSelected (Element) ', wenn ich auf die Zurück-Schaltfläche klicke –

0

diese Zeile entfernen

if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

von onOptionsItemSelected() so wird es wie dieser ich Toolbar von neuen ActionBarDrawerToggle entfernt

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

switch (item.getItemId()) { 
    case android.R.id.home: 
     // doesn't reach here ever. 
     return true; 
    case R.id.action_x: 
     // do something 
     return true; 
    case R.id.action_y: 
     // do something 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
} 
}