Mam dziwny problem. Tworzę aplikację z Targetsdk 13.
W metodzie onCreate mojego głównego działania wywołuję, getActionBar()
aby skonfigurować mój pasek akcji . Działa to dobrze, gdy działa na emulatorze systemu Android 3.2, ale podczas korzystania z systemu Android 3.0 i 3.1 getActionBar()
metoda zwraca wartość null.
Uważam to za wyjątkowo dziwne i nie widzę żadnego powodu, dla którego miałoby to zrobić. Czy jest to błąd w emulatorach, czy też muszę coś zrobić, aby upewnić się, że moja aplikacja ma pasek akcji?
ROZWIĄZANIE:
Myślę, że znalazłem rozwiązanie tego problemu. Nie używałem setContentView do ustawienia układu działania. Zamiast tego użyłem, fragmentTransaction.add(android.R.id.content, mFragment, mTag)
aby dodać fragment do ćwiczenia. To działało dobrze w 3.2, ale we wcześniejszych wersjach plastra miodu pasek akcji najwyraźniej nie jest ustawiony, jeśli nie używasz setContentView w onCreate()
metodzie. Więc naprawiłem to, używając setContentView()
metody w mojej onCreate()
metodzie i po prostu dostarczając jej układ zawierający pusty FrameLayout. Nadal mogę używać tej fragmentTransaction.add(android.R.id.content, mFragment, mTag)
metody w taki sam sposób jak poprzednio.
To nie jest najpiękniejsza poprawka, ale działa.
źródło
Odpowiedzi:
Można użyć
getSupportActionBar()
zamiastgetActionBar()
metody.źródło
Jeśli korzystasz z biblioteki wsparcia
użyj
getSupportActionBar()
zamiastgetActionBar()
* Aktualizacja:
Klasa ActionBarActivity jest teraz przestarzała:
Polecam użyć:
źródło
android.support.v7.app
:ActionBarActivity
przestarzałe Użyjandroid.support.v7.app.AppCompatActivity
zamiast tego.Musisz zdefiniować typ okna jako pasek akcji, zanim aktywność wyrenderuje widok.
posługiwać się
przed wywołaniem metody setContentView ().
źródło
jeśli używasz android.support.v7.app.AppCompatActivity
public class HomeActivity rozszerza AppCompatActivity {
Następnie powinieneś używać android.support.v7.app.ActionBar
Jeśli używasz android.support.v4.app.FragmentActivity
public class HomeActivity extends FragmentActivity {
wtedy powinieneś używać android.app.ActionBar
Jeśli używasz android.support.v7.app.ActionBarActivity
public class HomeActivity rozszerza ActionBarActivity {
powinieneś używać android.support.v7.app.ActionBar
źródło
Napotkałem powyższy problem, w którym
getActionBar()
metoda zwraca wartość null. DzwoniłemgetActionBar()
po ustawieniusetContentView()
i nadal zwracanull
.Rozwiązałem problem, ustawiając wersję min-sdk w pliku manifestu Androida, którego początkowo brakowało.
<uses-sdk android:minSdkVersion="11" />
źródło
ActionBar potrzebuje motywu aplikacji lub działania, aby mieć tytuł aplikacji. Upewnij się, że aplikacja lub aktywność nie została nadana jako Theme.NOTITLE.
źródło
następnie
następnie użyj
źródło
Ta odpowiedź jest spóźniona, ale może być pomocna dla każdego, kto przychodzi z Google: może być konieczne zgłoszenie
w twoim
styles.xml
. Wydaje się, żefalse
może to być ustawienie domyślne. Musisz także mieć interfejs API 11 lub nowszy.Więcej szczegółów można znaleźć w dokumentacji tutaj . W szczególności zacytuj:
źródło
Miałem ten sam problem i jednym z rozwiązań było skorzystanie
setContentView()
przed telefonemgetActionBar()
.Ale była inna rzecz, która rozwiązała problem. Określiłem motyw dla aplikacji
@android:style/Theme.Holo.Light
.Myślę,
<item name="android:windowActionBar">true</item>
że można użyć dowolnego tematu, który się w nim znajduje.źródło
Głównym tego powodem jest używanie motywów, które nie obsługują ActionBar:
W pliku manifestu dodaj następujące elementy do działania docelowego lub elementu aplikacji (jeśli chcesz ujednolicić motyw w całej aplikacji)
Przykłady motywów obsługujących pasek akcji
"Theme.AppCompat.Light"
lub"Theme.Holo.Light"
...Lepiej jest umieścić wszystkie style
styles.xml
i używać go wszędzie, używając,"@style/themName"
aby poprzedni była style.xml będą miały następujące elementy:
Poradnik:
"@android:style/Theme.Holo.Light.DarkActionBar"
nie są one obsługiwane przed wersjami SDK 14.Aby umożliwić aplikacji obsługę określonej minimalnej wersji pakietu SDK, możesz dodać następujący
<app>
element w sekcji :Aby określić minimalną wersję zestawu SDK w AndroidStudio, możesz użyć pliku Gradle aplikacji.
źródło
Natknąłem się na ten problem. Sprawdzałem numer wersji i włączałem pasek akcji tylko wtedy, gdy jest większy lub równy Honeycomb, ale zwracał null. Znalazłem przyczynę i główną przyczynę, że wyłączyłem styl Holo Theme w style.xml w folderze values-v11.
źródło
przejdź do AndroidManifest.xml i zamień
android: theme = "@ style / AppTheme"
android: theme = "@ android: style / Theme.Holo.Light.DarkActionBar"
źródło
Użyj getSupportActionBar () zamiast getActionBar ()
źródło
W moim przypadku miałem to w swoim kodzie, który nie działał:
Potem bawiłem się kolejnością kodu:
I zadziałało!
Wniosek: requestWindowFeature powinno być pierwszą rzeczą, którą wywołujesz w metodzie onCreate.
źródło
Miałem ten sam problem. Rozwiązano go, zmieniając motyw aplikacji w styles.xml
Przed
Po
źródło
Jedną rzeczą, którą chciałem dodać, ponieważ właśnie natknąłem się na to, jeśli próbujesz getActionBar () na działaniu, które ma rodzica, zwróci wartość null. Próbuję refaktoryzować kod, w którym moja aktywność jest zawarta w grupie ActivityGroup, i zajęło mi dobre kilka minut, aby przejść do „oh duh” po sprawdzeniu źródła tworzenia ActionBar w kodzie źródłowym.
źródło
Rozwiązuję to przez te zmiany:
android:theme="@android:style/Theme.Holo.Light" >
extends ActionBarActivity
import android.support.v7.app.ActionBarActivity
źródło
Aby dodać do innych odpowiedzi:
Upewnij się, że wywołujesz
setActionBar()
lubsetSupportActionBar()
w swojejonCreate()
metodzie przed wywołaniemgetActionBar()
:Zdefiniuj pasek narzędzi w swoim pliku activity.xml, a następnie w onCreate ():
źródło
Wiem, że spóźniłem się na imprezę (i nowy na Androida) w tej kwestii, ale znalazłem informacje tutaj bardzo pomocne i pomyślałem, że powinienem dodać wyniki moich własnych starań, aby ActionBar działał tak, jak chciałem, na wypadek, gdyby inni tacy jak ja przyszli szukam pomocy.
Mam widżet, który jest ruchomym oknem bez tytułu okna. Używam motywu styl do wdrożenia
android:windowIsFloating
,android:backgroundDimEnabled
aandroid:windowNoTitle
. Widżet działał dobrze, dopóki nie chciałem dodać przycisku, który wywoływał fragment pagera z kilkoma stronami z fragmentami listy i używał ActionBar. To spowodowałoby awarię podczas działania pagera z wyjątkiem wskaźnika zerowego. Zawęziłem to do wartości zerowej ActionBar. Zgodnie z ustaleniami poprzednich osób, które brały udział w tym wątku, usunąłem mój motyw z pliku manifestu i ActionBar działał dobrze, ale teraz moje okno było teraz dłuższe (było pełnoekranowe) i miało tytuł strony, którego nie chciałem.Dalsze badania doprowadziły mnie do Przewodnika szkoleniowego interfejsu API stylów i motywów, który doprowadził mnie do rozwiązania. Odkryłem, że mogę dodać mój motyw niestandardowy do poszczególnych działań w pliku manifestu, podczas gdy przed zastosowaniem go w aplikacji. Wszystkie moje okna mają teraz pożądany wygląd.
źródło
Spróbuj rozszerzyć swoją klasę Activity z ActionBarActivity. To rozwiązało to dla mnie. Zrób coś takiego:
W moim przypadku klasa rozszerzała się tylko z Activity.
źródło
Może to również pomóc niektórym osobom.
W moim przypadku było tak, ponieważ nie zdefiniowałem kontekstu w menu.xml
Spróbuj tego:
Zamiast tego:
źródło
Wystarczy sprawdzić implementację kodu źródłowego, klikając polecenie:
requestWindowFeature (Window.FEATURE_ACTION_BAR); Naprawiono mój problem, ponieważ zobaczyłem, że requestWindowFeature (Window.FEATURE_ACTION_BAR) nie działa; kod jest open source użyj go !!
źródło
android.support.v7.app.ActionBar actionBar = getSupportActionBar();
działa dość szybko
źródło
W moim przypadku po prostu musiałem
AppCompatActivity
zamiast tego przedłużyćActivity
Przykładowa klasa pełnej aktywności:
import android.os.Bundle import androidx.appcompat.app.AppCompatActivity
W wersjach
źródło