2014-12-01 15 views
47

Używam nowego paska narzędzi z biblioteki Appcompat V7 i robię aplikację z szufladą nawigacji i fragmentami."Przycisk" za pomocą paska narzędzi getSupportActionbar i appcompat v7

W niektórych fragmentach nie chcę, aby pokazać ikonę hamburger ale strzałkę zamiast ... To jest w porządku, zrobiłem to w ten sposób:

mDrawerToggle.setDrawerIndicatorEnabled(false); 

mDrawerToggle.syncState(); 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setHomeButtonEnabled(true); 
getSupportActionBar().setDisplayShowHomeEnabled(true); 

getSupportActionBar().setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 

Moje pytanie brzmi: Jak lub gdzie musisz założyć przycisk startowy lub czego potrzebuję do słuchania przycisku "wstecz"? chcę zadzwonić główną metodę backpressed i ustawić z powrotem ikonę szuflady nawigacji z ikoną hamburger ..

Odpowiedz

39

można to zrobić tak:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    toolbar = (Toolbar)findViewById(R.id.toolbar); 
    if (toolbar != null) { 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    setUpNavigationDrawer(); 

    getFragmentManager().addOnBackStackChangedListener(backStackListener); // listen to the backstack of the fragment manager 
} 

Zdefiniuj onBackSTackChangedListener:

private FragmentManager.OnBackStackChangedListener backStackListener = new FragmentManager.OnBackStackChangedListener() { 
    @Override 
    public void onBackStackChanged() { 
     setNavIcon(); 
    }; 
} 

Ustaw ikonę według backstack Twojego fragment za:

protected void setNavIcon() { 
    int backStackEntryCount = getFragmentManager().getBackStackEntryCount(); 
    drawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0); 
} 

Detect po naciśnięciu ikony szuflada:

public boolean onOptionsItemSelected(MenuItem item) { 
    if (drawerToggle.isDrawerIndicatorEnabled() && drawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

    switch (item.getItemId()) { 
     case x: 
     return true; 
     default: 
     return false; 
    } 
} 

i uchwyt w górę przycisk:

public boolean onSupportNavigateUp() { 
    onBackPressed(); 
    return true; 
} 

To działa dla mnie. Powodzenia.

+0

Co 'przypadek x' ma być? –

+0

@tanneebee: jak otrzymać kliknięcie strzałki wstecz? – Mona

+0

Metody onSupportNavigateUp działa – Jayesh

2

aktywować przycisk Wstecz:

getActionBar().setDisplayHomeAsUpEnabled(enable); 

i nasłuchiwać kliknięć w onBackPressed()

Oczywiście swoją działalność musi przedłużyć ActionBarActivity

31

Nie wiem, czy to działa w przypadku OP, ale w wielu przypadkach jest to prawdopodobnie najprostsza opcja zaimplementowania przycisku Wstecz z paskiem narzędzi AppCompat.

Pomiń wszystkie rzeczy: setHomeButtonEnabled, setDisplayHomeAsUpEnabled i i related issues.

Zamiast podczas inicjalizacji Toolbar, wystarczy ustawić ikonę nawigacji 1) i 2) OnClickListener nawigacja za nim:

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

if (enableBackNavigation) { 
    toolbar.setNavigationIcon(R.drawable.ic_back); 
    toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onBackPressed(); 
     } 
    }); 
} 
+0

To nie zatrzymuje przesuwania od krawędzi, aby wysunąć szufladę nawigacji. – takrishna

+0

Nie działa z funkcją CollapsingToolbarLayout –

+0

Niesamowite rozwiązanie –

16

1- Tworzenie Toolbar układ;

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/dark_blue" 
    android:minHeight="?attr/actionBarSize" 
    local:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> 

2- uwzględnienie tego w układzie w miejscu, w którym chcesz toolbar być.

3- Wklej następujący kod w swojej działalności. (Rozciąga ActionBarActivity)

private Toolbar mToolbar; 

//For Toolbar (Action bar) start 
     mToolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(mToolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     mToolbar.setNavigationIcon(R.drawable.ic_back_arrow); 
     mToolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onBackPressed(); 
      } 
     }); 
     getSupportActionBar().setTitle("Event Details"); 
     //For Toolbar (Action bar) end 

4- zmienić ikonę Back Kliknij, aby cokolwiek chcesz.

+0

To bardzo jasne, łatwe do zrozumienia, wydajne i wielokrotnego użytku rozwiązanie. Zrobiłbym to w ten sam sposób! Dobra robota! ;) – Khaled

+0

@Khaled - Dziękuję bardzo ... –

63

Dodaj tę metodę w onCreate():

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

Następnie zastąpić onOptionItemSelected() jak poniżej:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      onBackPressed(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 
+0

Łatwo, elegancko i działa! Tks –

+0

@SeverianoJaramilloQuintanar Powodzenia –

2

prostu można ustawić ikonę nawigacji i upewnij się, że ustawienie setNavigationOnClickListener() po ustawieniu setSupportActionBar(toolbar)

toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back)); 
toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     onBackPressed(); 
    } 
}); 
0

w człowieku IFEST dodać te linie na podstawie aktywności chcesz strzałkę wstecz roboczą

android: parentActivityName = „rodzic nazwę aktywność”

Powiązane problemy