74

Ho ActionBarActivity con NavigationDrawer e utilizzo support_v7 Toolbar come ActionBar. In uno dei miei frammenti la barra degli strumenti ha una vista personalizzata. In altri frammenti Toolbar dovrebbe mostrare il titolo.Come ottenere la barra degli strumenti dal frammento?

Come ottenere l'istanza Toolbar per la personalizzazione dai frammenti? Posso ottenere ActionBar con getActivity().getActionBar(), ma se chiamo setTitle() per questa istanza ActionBar non fa nulla.

UPD:

Nel mio caso

((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

(come ha detto MrEngineer13) non funzionano in fase di creazione primo frammento, perché io lo chiamo da onHiddenChanged(). Ora aggiungo più uno a onCreateView() e funziona perfettamente.

+0

frammenti non hanno actionbars/attività barre degli strumenti fanno – tyczj

+0

(MainAcivity) this.getActivity()) getToolbar() ; sarà la risposta giusta !! per ottenere la barra degli strumenti in frammento !! –

risposta

147

È necessario prima trasmettere la propria attività da getActivity() a AppCompatActivity. Ecco un esempio:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(); 

Il motivo è necessario lanciare è perché getActivity() restituisce un FragmentActivity e avete bisogno di un AppCompatActivity

+7

ottenere 'supportActionBar' e 'toolbar' è la stessa cosa? – Darpan

+0

@Darpan si, funziona per me (barra degli strumenti) –

+0

@Darpan non sicuro –

1

Forse dovresti provare getActivity().getSupportActionBar().setTitle() se stai usando support_v7.

63

In frammenti caso avrebbe dovuto visualizzazione personalizzata del ToolBar è possibile implementare Toolbar per ogni frammento separatamente .

aggiungere ToolBar in fragment_layout:

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/colorPrimaryDark"/> 

trovano nel frammento:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment, container, false); 
     Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); 

     //set toolbar appearance 
     toolbar.setBackground(R.color.material_blue_grey_800); 

     //for crate home button 
     AppCompatActivity activity = (AppCompatActivity) getActivity(); 
     activity.setSupportActionBar(toolbar); 
     activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 

menù ascoltatore può essere creata in due modi: Override onOptionsItemSelected nel frammento:

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

o imposta listener per la barra degli strumenti quando lo si crea in onCreateView():

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem menuItem) { 
       return false; 
      } 
     }); 
+2

Si prega di aggiornare. Ora devi lanciare su 'AppCompatActivity'. – naXa

+1

Voglio solo confermare questo il modo giusto di fare? se cariciamo frammenti diversi con la barra degli strumenti in viewpager + Tablayout o Pagertabstripe, ciò influirà sulle prestazioni dell'app mentre si scorre? –

+1

@LOG_TAG Ho un design del cassetto con ciascun frammento che implementa la barra degli strumenti (e quindi ha una barra degli strumenti nel suo file di layout) e il codice sopra ha funzionato benissimo per me. – MattBoothDev

6
toolbar = (Toolbar) getView().findViewById(R.id.toolbar); 
AppCompatActivity activity = (AppCompatActivity) getActivity(); 
activity.setSupportActionBar(toolbar); 
1

Dal tuo Fragment: (ottenere Toolbar dal frammento?)

// get toolbar 
((MainAcivity)this.getActivity()).getToolbar(); // getToolbar will be method in Activity that returns Toolbar!! don't use getSupportActionBar for getting toolbar!! 
// get action bar 
this.getActivity().getSupportActionBar(); 

Questo è molto utile quando si utilizza filatore nella barra degli strumenti e chiamare il filatore o personalizzato visualizzazioni in Toolbar da un frammento!

dalla vostra attività:

// get toolbar 
this.getToolbar(); 
// get Action Bar 
this.getSupportActionBar(); 
+3

Devi avere un metodo nella tua attività chiamato ** getToolbar() **, che è male, perché quello è non come dovrebbe essere fatta la comunicazione tra attività e frammento. – Marko

+2

sì, non c'è altro modo per questo !! molte delle librerie del cassetto di navigazione implementano solo questo stile !!! alcune volte abbiamo bisogno di trasmettere l'attività a causa di AppCompatActivity (AppCompatActivity) getActivity() che è un altro punto dolente !!! tutto questo materiale uccide totalmente il tempo di sviluppo :( –

34

si hanno due scelte per arrivare Toolbar nel frammento

Primo uno

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

e secondo

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar; 
+0

Ma è questo il modo giusto .. bcoz abbiamo ottenutoSupportedActionBar anche? –

+0

Davvero superbo .... – VVB

+0

perfect responder –

0

È possibile creare un metodo per r questo sulla vostra attività di classe:

public void setToolbarTitle(String title) { 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    toolbar.setTitle(title); 
} 

E si può usare in questo modo:.

setToolbarTitle("Hello World"); 
Problemi correlati