2015-10-15 6 views
6

Mam 1 aktywność z 3 fragmentami wewnątrz (Home-Login-RestorePass) Początkowo HomeFragment pokazuje, a pozostałe dwie są ukryte. Chcę, aby tytuł ActionBar zmienił się w zależności od tego, który Fragment się wyświetla.ActionBar Tytuł dynamicznie zmienia się z fragmentem

próbuję w mojej działalności z:

public void setActionBarTitle(String title){ 
    getSupportActionBar().setTitle(title); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    // Set title 
    setActionBarTitle(getString(R.string.app_name)); 
} 

i fragmenty ma takie same:

@Override 
public void onResume() { 
    super.onResume(); 
    // Set title 
    ((LoginActivity) getActivity()).setActionBarTitle(getString(R.string.fragment_login)); 
} 

Ale to nie działa. Zawsze pokazuje on R.string.fragment_login na tytule.

Używam FragmentTransaction do przejścia fragmentu:

btnLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
      HomeFragment homeFragment = (HomeFragment) getFragmentManager().findFragmentById(R.id.fragmentHome); 
      LoginFragment loginFragment = (LoginFragment) getFragmentManager().findFragmentById(R.id.fragmentLogin); 
      ft.hide(homeFragment).addToBackStack(null); 
      ft.show(loginFragment).addToBackStack(null).commit(); 
     } 
    }); 

Dodatkowo jeśli mogę zrobić pojawiają strzałką przycisk (Wstecz) na ActionBar zależności od fragmentu byłoby świetnie.

Dziękujemy za poświęcony czas! Pozdrowienia.

+0

Czy rozważałeś użycie 'add()'/'remove()' na 'Fragment's zamiast' show() '/' hide() '? Problem wygląda na to, że może to być spowodowane sprzecznymi wywołaniami, aby zmienić tytuł paska akcji, ponieważ nawet ukryte "Fragmenty" są "aktywne", brakuje im tylko interfejsu użytkownika. Również wywołanie 'Fragment' on ones() pojawia się po twoim' Activity', a w obu 'Fragmentach 'twój najwyraźniej (przechodząc przez twój kod) ustawia tytuł' fragment_login' ...? – PPartisan

+0

@PPartisan dzięki za poświęcony czas, próbowałem z add()/remove(), ale to nie działa, pozostałe 2 fragmenty są nad głównym fragmentem, najwyraźniej remove() nie zdejmuje fragmentów z widoku aktywności. Wszystkie moje fragmenty mają swoje unikalne wywołanie setActionBarTitle (* fragmentString *). Wyraziłem błąd, przepraszam. Jeszcze raz dziękuję :) –

+0

Zobacz ten link https://stackoverflow.com/a/46705242/1770868 –

Odpowiedz

8

Zastosowanie tej metody w działalności zmienić Fragment i ustawić tytuł programowo:

private void displayFragment(int position) { 
    // update the main content by replacing fragments 
    Fragment fragment = null; 
    String title = ""; 
    switch (position) { 
    case 0: 
     fragment = new Home(); 
     title = "Home"; 
     break; 
    case 1: 
     fragment = new Login(); 
     title = "Login"; 
     break; 
    case 2: 
     fragment = new RestorePass(); 
     title = "Restore Password"; 
     break; 

    default: 
     break; 
    } 

    // update selected fragment and title 
    if (fragment != null) { 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 
     getSupportActionBar().setTitle(title); 
     // change icon to arrow drawable 
     getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_arrow); 
    } 
} 

na przykład, chcesz Fragment Home być wyświetlane:

displayFragment(0); 
+0

i f% & (# ing love you =) haha ​​.. dzięki temu rozwiązujesz 3 wątpliwości. Dziękuję, miłe weekendy. –

7

Należy pamiętać, że jeśli korzystasz z biblioteki pomocy technicznej, musisz rzucić swoją aktywność, gdy przejdziesz ją przez getActivity(). A następnie będziesz chciał upewnić się, że pobierasz wsparcie ActionBar za pomocą getSupportActionBar(). Udało mi się ustawić tytuł ActionBar w mojej aplikacji za pomocą następującego kodu w moim Fragment na onResume() ...

@Override 
public void onResume() { 
    super.onResume(); 
    AppCompatActivity activity = (AppCompatActivity) getActivity(); 
    ActionBar actionBar = activity.getSupportActionBar(); 
    actionBar.setTitle(R.string.my_fragment_title); 
} 
+0

Działa dobrze. Dzięki – sivaprakash

0

Jeśli ustawisz atrybut android:label="" aktywność w AndroidManifest będzie można ustawić inicjowanie tytułu. Odkryłem to śledzenie za pomocą kodu źródłowego Toolbar.