2016-05-19 29 views
14

Sto usando una barra degli strumenti personalizzata. Devo aggiungere il pulsante indietro. Ora sto usando questo codice per aggiungere il pulsante Indietro.Come implementare la barra degli strumenti di Android Pulsante Indietro

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
     toolbar.setBackgroundColor(getResources().getColor(R.color.white)); 
     toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.back_arrow)); 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onBackPressed(); 
      } 
     }); 

Questo funziona correttamente. Posso vedere il pulsante Indietro aggiunto. Ma considera il caso in cui sono in Fragment1 che non ha un pulsante indietro. Ora mi sposto su Fragment2 e aggiungo il pulsante Indietro. Da Framment 2 apro Fragment 3 e aggiungo di nuovo il pulsante back.

Ora, quando premo il pulsante da fragment3 per tornare a fragment2, devo controllare lo stack dei frammenti per vedere se il pulsante back è richiesto nel frammento 2 oppure no.

C'è un altro modo per gestire automaticamente il pulsante indietro mentre si inseriscono i frammenti?

+0

Potete farmi più chiaro ciò che si vuole esattamente premuto? – Masum

+0

aggiornato la mia domanda – Zach

risposta

0

È possibile gestire l'icona posteriore molto facilmente. Se tutti i frammenti sono in un'unica attività Consiglio vivamente per gestire questa situazione con seguente modo:

prima cassa di una classe BaseFragment astratta che implementa FragmentManager .OnBackStackChangedListener poi mettere seguente metodo all'interno che:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mainActivity = (MainActivity) getActivity(); 

     getFragmentManager().addOnBackStackChangedListener(this); 

     shouldDisplayHomeUp(); 
    } 

    @Override 
    public void onBackStackChanged() { 
     shouldDisplayHomeUp(); 
    } 


    public boolean shouldDisplayHomeUp() { 
     //Enable Up button only if there are entries in the back stack 
     boolean canBack = false; 
     try { 
      canBack = getFragmentManager().getBackStackEntryCount() > 0; 
     } catch (Exception ex) { 
//   Log.e(getClass().getCanonicalName(), ex.getMessage());getMessage 
     } 

     if (canBack) { 
      mainActivity.drawerDisable(); 
     } else { 
      mainActivity.drawerEnable(); 
     } 
     return canBack; 
    } 

In questo modo disableDrawer & enableDrawer La funzione gestisce il tuo Icon e il metodo OnBackPressed gestisce il tuo BackStack Now nella tua attività quando premi visualizzazione back-icon, se necessario. il vostro onBackPressed dovrebbe essere qualcosa di simile:

int backStackCount = getSupportFragmentManager().getBackStackEntryCount(); 

      if (backStackCount == 0) { 
       //nothing exist in backStack OS handle it 
       super.onBackPressed(); 
      } else { 

       getSupportFragmentManager().popBackStack(); 
} 

Vedi piena attuazione here.

+0

Grazie per la risposta. Sai perché onBackStackChanged viene chiamato più volte quando un frammento viene rimosso dallo stack? – Zach

+0

Penso che sia dovuto a ** BackStack ** push/pop ma non ne sono sicuro. – Amir

7

Ciò presuppone si utilizza un AppCompatActivity

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

     toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object 
     setSupportActionBar(toolbar); 

     // enabling action bar app icon and behaving it as toggle button 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
    } 

Poi nel onOptionsItemSelected è possibile ignorare il tasto Home come segue:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     else if(id == android.R.id.home){ 
      Intent i= new Intent(this, MainActivity.class); 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(i); 
      finish(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
10

Basta aggiungere due nuovi riga di codice. Qualcosa di simile

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
toolbar.setBackgroundColor(getResources().getColor(R.color.white)); 
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.back_arrow)); 

setSupportActionBar(toolbar); 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     onBackPressed(); 
    } 
}); 
0

uso Metodo della classe tua attività

private void setupToolbar(){ 
    Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     ActionBar actionBar=getSupportActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setDisplayShowHomeEnabled(true); 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override 
      public void onClick(View v) { 
      finish(); 
      } 
       }); 
       } 
+0

Mentre la risposta potrebbe essere solo di codice, è meglio spiegare un po 'quello che hai fatto, questo aggiunge valore alla tua risposta anche in futuro – DaFois

0

opere di It On di nuovo la funzione di barra degli strumenti

private setUpToolBar() { 

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

setSupportActionBar(toolbar); 

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

getSupportActionBar().setDisplayShowHomeEnabled(true); 

toolbar.setNavigationOnClickListener(new View.OnClickListener() { 

@Override 

public void onClick(View v) { 

onBackPressed(); 

} 

}); 

} 
+0

Si prega di modificare il codice correttamente e aggiungere qualche spiegazione. – Billa

Problemi correlati