Zaczynam nowy projekt, który używa AppCompat/ActionBarCompat
w v7
bibliotece wsparcia. Próbuję wymyślić, jak korzystać getSupportActionBar
z fragmentu. Moja aktywność, która obsługuje ten fragment, jest rozszerzona ActionBarActivity
, ale nie widzę podobnej klasy obsługi dla fragmentów.
Z mojego fragmentu
public class CrimeFragment extends Fragment {
//...
getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment
//...
}
Strona google dotycząca korzystania z niego ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) mówi, że nie powinno być żadnych zmian w tym v4
fragmencie. Czy muszę przekazywać wszystkie getActivity()
połączenia na numer ActionBarActivity
? To wygląda na kiepski projekt.
Chociaż to pytanie ma już zaakceptowaną odpowiedź, muszę zaznaczyć, że nie jest całkowicie poprawne: wywołanie
getSupportActionBar()
zFragment.onAttach()
spowodujeNullPointerException
, że działanie zostanie obrócone.Krótka odpowiedź:
Użyj
((ActionBarActivity)getActivity()).getSupportActionBar()
wonActivityCreated()
(lub dowolnym późniejszym momencie w jego cyklu życia) zamiastonAttach()
.Długa odpowiedź:
Powodem jest to, że jeśli obiekt
ActionBarActivity
zostanie odtworzony po obróceniu, przywróci wszystkie fragmenty przed faktycznym utworzeniemActionBar
obiektu.Kod źródłowy
ActionBarActivity
wsupport-v7
bibliotece:ActionBarActivityDelegate.createDelegate()
tworzymImpl
obiekt w zależności od wersji Androida.super.onCreate()
jestFragmentActivity.onCreate()
, który przywraca wszystkie poprzednie fragmenty po rotacji (FragmentManagerImpl.dispatchCreate()
, & c).mImpl.onCreate(savedInstanceState)
isActionBarActivityDelegate.onCreate()
, który odczytujemHasActionBar
zmienną ze stylu okna.mHasActionBar
to prawda,getSupportActionBar()
zawsze wrócinull
.Źródło
ActionBarActivityDelegate.getSupportActionBar()
:źródło
ActionBarActivity
jest przestarzałe. UżyjAppCompatActivity
zamiast tegoJeśli ktoś używa com.android.support:appcompat-v7: i AppCompatActivity jako aktywności, to zadziała
źródło
w
fragment.xml
dodanymToolbar
tagu z biblioteki wsparciaJak możemy to kontrolować z
MyFragment
klasy? Zobaczmywewnątrz
onCreateView
funkcji dodaj następujące elementya jeśli chcesz dodać
items
do paska narzędzi wewnątrzMyFragment
,must
dodaj tę linię wewnątrzonCreateView
funkcjita linia jest ważna, jeśli ją zapomnisz, Android nie zapełni twoich pozycji menu.
załóżmy, że identyfikujemy je w
menu/fragment_menu.xml
po tym nadpisuje następujące funkcje
mam nadzieję że to pomoże
źródło
Jako zaktualizowana odpowiedź na odpowiedź Pierre-Antoine LaFayette
ActionBarActivity jest przestarzałe; użyj
AppCompatActivity
zamiast tegoźródło
Dla osób używających kotlin,
źródło