Mam moduł kodu, który implementuje viewpager z szufladą nawigacji, jednak po uruchomieniu kodu pojawia się następujący błąd
01-26 09:20:02.958: D/AndroidRuntime(18779): Shutting down VM
01-26 09:20:02.959: E/AndroidRuntime(18779): FATAL EXCEPTION: main
01-26 09:20:02.959: E/AndroidRuntime(18779): Process: com.example.tabwithslidingdrawer, PID: 18779
01-26 09:20:02.959: E/AndroidRuntime(18779): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tabwithslidingdrawer/com.example.tabwithslidingdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.access$800(ActivityThread.java:148)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.os.Handler.dispatchMessage(Handler.java:102)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.os.Looper.loop(Looper.java:135)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.main(ActivityThread.java:5312)
01-26 09:20:02.959: E/AndroidRuntime(18779): at java.lang.reflect.Method.invoke(Native Method)
01-26 09:20:02.959: E/AndroidRuntime(18779): at java.lang.reflect.Method.invoke(Method.java:372)
01-26 09:20:02.959: E/AndroidRuntime(18779): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
01-26 09:20:02.959: E/AndroidRuntime(18779): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
01-26 09:20:02.959: E/AndroidRuntime(18779): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779): at com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.Activity.performCreate(Activity.java:5953)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
01-26 09:20:02.959: E/AndroidRuntime(18779): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
01-26 09:20:02.959: E/AndroidRuntime(18779): ... 10 more
09:20:02.959: E/AndroidRuntime(18779): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference 01-26 09:20:02.959: E/AndroidRuntime(18779): at com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
wskazuje na tę linię
// enabling action bar app icon and behaving it as a toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
cały kod http://pastebin.com/u1K72fr7
Mój manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tabwithslidingdrawer"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Tabwithpager" >
<activity
android:name="com.example.tabwithslidingdrawer.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
android: theme = "@ style / Theme.Tabwithpager"
kod http://pastebin.com/EFQLzRej
==================================================== ================ EDYCJA / AKTUALIZACJA:
Czego się z tego nauczyłem
Ilekroć wystąpi taki błąd
1. Sprawdź, jakiego rodzaju Aktywność jest używana, czy jest to proste działanie android.app, AppCompatActivity, czy ActionBarActivity i tak dalej.
2. Sprawdź, czy Twój typ aktywności, który jest rozszerzony, mieści się w kategorii kompatybilności
przykład Aktywność / fragment oparty na android.app nie jest typem appCompat, podczas gdy android.support.v4.app.Fragment lub android.support.v4.app.ActivityCompat są oparte na appCompat
jeśli mieści się w appCompat, używamy getSupportActionBar (), w przeciwnym razie dla typów android.app możemy użyć getActionBar ()
3. Sprawdź motyw zastosowany do danej czynności w pliku manifestu
przykład: w pliku manifestu, jeśli zastosowano motyw, powiedzmy android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () będzie działać
ale jeśli motyw zastosowany do działania w manifeście jest następujący android: theme = "@ style / Theme.AppCompat.Light", musisz użyć metody getSupportActionBar ()
getSupportActionbar()
?supportActionBar
(nie zerową) z Twoim motywem. Czy zastąpić wszystkogetActionBar
zgetSupportActionBar
? Jeszcze 1 rzecz, powinieneś zaktualizować swój nowy dziennik błędów.getActionBar()
w swoimMainActivity
... Sprawdź to i zmień nagetSupportActionBar
.Odpowiedzi:
Twój kod rzuca się na
com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
:Problem jest dość prosty
Activity
- dziedziczysz po nowymandroid.support.v7.app.ActionBarActivity
. Powinieneś używać wywołaniagetSupportActionBar()
zamiastgetActionBar()
.Jeśli spojrzysz powyżej linii 65 kodu, zobaczysz, że już to robisz:
A potem niżej wokół linii 87 wygląda na to, że odkryłeś to samo:
Zwróć uwagę, jak skomentowałeś
getActionBar()
.źródło
android.support.v7.app.ActionBarActivity
został wycofany na korzyśćandroid.support.v7.app.AppCompatActivity
. Ale problem jest ten sam.Jeśli ktoś chce używać android.app.ActionBar i android.app.Activity , powinien zmienić motyw aplikacji w styles.xml , na przykład:
Problem polega na tym, że możesz używać motywu AppCompat .
Z drugiej strony, jeśli chcesz używać android.support.v7.app.ActionBar i rozszerzasz swoją aktywność o AppCompatActivity , musisz użyć motywu AppCompat, aby uniknąć tego problemu, na przykład:
Mam nadzieję że to pomoże.
źródło
AppCompatActivity
zamiastActivity
, jak w tej odpowiedzi .kiedy rozszerzasz appcompatActivity, użyj
a kiedy rozszerzasz ActionBar, użyj
nie zapomnij wywołać tej funkcji w oncreate po zainicjowaniu paska narzędzi / paska akcji
źródło
Myślę, że chcesz rzucić getActivity (). Na przykład:
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Oto, co musisz zrobić z nowymi bibliotekami wsparcia. AppCompatActivity zastąpił ActionBarActivity.
źródło
Spróbuj sprawdzić tutaj
res >> wartości >> styles.xml
upewnij się, że nie ma takiego kodu
jeśli istnieje taki kod, możesz go na chwilę wyłączyć lub usunąć
źródło
<item name="windowNoTitle">true</item>
, który musiał zostać usunięty.android:theme="@style/AppTheme.NoActionBar"
z<avticity>
tagu na AndroidManifest.xmlW przypadku korzystania z AppCompatActivity musi wywołać
Przed
getSupportActionBar()
źródło
Przycisk W górę jest zwykle aktywowany dla działań niskiego poziomu. W twoim manifeście widzę tylko MainActivity. Nie sądzę, aby aktywacja przycisku w górę dla głównego działania miała sens. Utwórz działanie, a następnie w manifeście dodaj atrybut parentActivityName. Następnie aktywuj przycisk w górę w metodzie onCreate działania.
To powinno pomóc.
https://developer.android.com/training/appbar/up-action.html
źródło
W moim przypadku jest to spowodowane
styles.xml
ustawieniem niewłaściwego motywu nadrzędnego, czyliNoActionBar
motyw oczywiściegetSupportActionbar()
jest pusty:Zmieniłem to na coś innego, naprawiłem to:
źródło
Spróbuj mieć nadzieję, że zadziała, mój kod działa dobrze
źródło
w tym wierszu w swojej działalności:
Użyj tego:
*
to twoja aktywnośćźródło
W moim przypadku miałem ten sam błąd, ale moim błędem było to, że nie zadeklarowałem mojego paska narzędzi Toolbar.
Tak więc, zanim użyłem getSupportActionBar, musiałem znaleźć mój pasek narzędzi i ustawić actionBar
źródło
Wiem, że to pytanie jest stare. Ale może to pomóc wielu osobom, które przedstawiają ten problem.
Aby rozwiązać ten problem, sprawdź, czy istnieje punkt nieważności. Następnie zastosuj odpowiednią konfigurację:
źródło
Jeśli używasz android.app.ActionBar i android.app.Activity, powinieneś zmienić motyw aplikacji w tagu aplikacji:
źródło
Jeśli napotkasz ten błąd
Po prostu użyj
źródło
Dla każdego, kto ma BaseActivity i dziecko, które z niej wyrasta, upewnij się, że super.onCreate () jest wywoływane jako pierwsze, zanim cokolwiek zrobisz. Stara aktywność działałaby, gdybyś później wywołał super.onCreate ().
Dziecko rozszerza Aktywność - może zadzwonić do super, gdy coś zrobisz
Dziecko rozszerza AppCompatActivity - najpierw musisz zadzwonić super
źródło
Dla tych, którzy nadal mają ten problem, mój problem został rozwiązany w pliku AndroidManifest.xml. Tam, gdzie jest napisane
<activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">
, musisz usunąćNoActionBar
, robiąc to<activity android:name=".MainActivity" android:theme="@style/AppTheme">
, ponieważ przy ustawieniu NoActionBar aplikacja nie wie, czy chce paska akcji, gdy wywołujesz go w MainActivity.javaźródło
Kiedyś wystąpił ten sam błąd, utworzyłem szablon dla domyślnego paska narzędzi (toolbar.xml), a następnie w innym widoku utworzyłem zwijany pasek narzędzi.
Wymagałem dodania zwijanego paska narzędzi do widoku, który pokazuje niektóre informacje o użytkowniku (jak WhatsApp), ale metoda findViewById odwołuje się do domyślnego paska narzędzi (pasek narzędzi id), a nie zwijanego (również pasek narzędzi id) tak, napisałem ten sam identyfikator do obu pasków narzędzi, więc kiedy próbowałem uzyskać dostęp do działania, aplikacja uległa awarii, pokazując mi błąd.
Naprawiłem błąd, zmieniając identyfikator zwijanego paska narzędzi na id: col_toolbar i błąd zniknął, a moja aplikacja działała idealnie
źródło
Powinieneś spróbować tego. Myślę, że to zadziała.
źródło
Najlepsze rozwiązanie to zrobić w metodzie Oncreate
po którym następuje nowa klasa
źródło
Dodaj później
Toolbar
źródło
Jestem nowy w tworzeniu aplikacji na Androida. Napotkałem ten błąd i spędziłem prawie 5 godzin próbując go naprawić. W końcu dowiedziałem się, że główną przyczyną tego problemu jest następujący problem i jeśli ktoś, kto stanie się z tym problemem ponownie w przyszłości, przeczytaj to.
Próbowałem stworzyć aktywność domową z tłem wideo, dla której musiałem zmienić motyw nadrzędny z domyślnego ustawienia
Theme.AppCompat.Light.DarkActionBar
naTheme.AppCompat.Light.NoActionBar
. To działało dobrze w przypadku działania domowego, ale kiedy ustawię nowy przycisk z listwą onclick, aby przejść do innego działania, w którym ustawiłem niestandardowy tekst na pasku akcji, ten błąd jest generowany.W końcu stworzyłem dwa tematy i przypisałem je do poniższych działań.
Wprowadziłem następujące zmiany, aby naprawić błąd.
Definiowanie motywów w styles.xml
Powiązanie działań z odpowiadającymi im tematami w
AndroidManifest.xml
źródło
Ilekroć wystąpi taki błąd. Spróbuj sprawdzić następujące rzeczy
Sprawdź, jakiego rodzaju aktywność jest używana, czy jest to prosta aktywność android.app, czy AppCompatActivity, czy ActionBarActivity i tak dalej.
Sprawdź, czy rozszerzony typ aktywności mieści się w kategorii kompatybilności
przykład Aktywność / fragment oparty na android.app nie jest typem appCompat, podczas gdy android.support.v4.app.Fragment lub android.support.v4.app.ActivityCompat są oparte na appCompat
jeśli mieści się w appCompat, używamy getSupportActionBar (), w przeciwnym razie dla typów android.app możemy użyć getActionBar ()
przykład: w pliku manifestu, jeśli zastosowano motyw, powiedzmy android: theme = "@ android: style / Theme.Holo.Dialog" getActionBar () będzie działać
ale jeśli motyw zastosowany do działania w manifeście jest następujący android: theme = "@ style / Theme.AppCompat.Light", musisz użyć metody getSupportActionBar ()
źródło
jeśli utwórz nowy pasek narzędzi, zastosuj, sprawdź, czy zastosowałeś metodę setSupportActionBar (); to zdecydowanie ci pomoże
źródło
Spróbuj to zrobić:
Zamiast tego:
źródło
getSupportActionBar()
jeśli masz już wynik wactionBar
zmiennej? Oba warianty są złe.