Ich habe ein Codemodul, das Viewpager mit Navigationsleiste implementiert. Wenn ich jedoch den Code ausführe, wird der folgende Fehler angezeigt
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)
zeigt auf diese Linie
// enabling action bar app icon and behaving it as a toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
gesamter Code http://pastebin.com/u1K72fr7
Mein 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"
Code http://pastebin.com/EFQLzRej
================================================== =============== EDIT / UPDATE:
Was ich daraus gelernt habe
Wann immer ein solcher Fehler auftritt
1. Überprüfen Sie, welche Art von Aktivität verwendet wird, ob es sich um eine einfache android.app-Aktivität oder eine AppCompatActivity oder eine ActionBarActivity usw. handelt.
2. Überprüfen Sie, ob Ihr erweiterter Aktivitätstyp unter die kompatible Kategorie fällt
Beispiel android.app-basierte Aktivitäten / Fragmente sind keine appCompat-Typen, während android.support.v4.app.Fragment oder android.support.v4.app.ActivityCompat appCompat-basiert sind
Wenn es unter appCompat fällt, verwenden wir getSupportActionBar (). Andernfalls können wir für android.app-Typen getActionBar () verwenden.
3. Überprüfen Sie das Thema, das auf die betreffende Aktivität in der Manifestdatei angewendet wurde
Beispiel: Wenn in der Manifestdatei das angewendete Thema "android: theme =" @ android: style / Theme.Holo.Dialog "lautet, funktioniert getActionBar ()
Wenn das für die Aktivität im Manifest angewendete Thema jedoch wie folgt lautet: android: theme = "@ style / Theme.AppCompat.Light", müssen Sie getSupportActionBar () verwenden.
getSupportActionbar()
?supportActionBar
mit Ihrem Thema (nicht null) bekommen . Haben Sie allegetActionBar
durch ersetztgetSupportActionBar
? 1 weitere Sache, sollten Sie Ihr neues Fehlerprotokoll aktualisieren.getActionBar()
in IhremMainActivity
... Überprüfen Sie es und wechseln Sie zugetSupportActionBar
.Antworten:
Ihr Code wirft auf
com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
:Das Problem ist ziemlich einfach - Sie
Activity
erben vom Neuenandroid.support.v7.app.ActionBarActivity
. Sie sollten einen AnrufgetSupportActionBar()
anstelle von verwendengetActionBar()
.Wenn Sie oben in Zeile 65 Ihres Codes nachsehen, werden Sie feststellen, dass Sie dies bereits tun:
Und dann weiter unten in Zeile 87 sieht es so aus, als hätten Sie dasselbe herausgefunden:
Beachten Sie, wie Sie auskommentiert haben
getActionBar()
.quelle
android.support.v7.app.ActionBarActivity
wurde zugunsten von abgelehntandroid.support.v7.app.AppCompatActivity
. Aber das Problem ist das gleiche.Wenn jemand android.app.ActionBar und android.app.Activity verwenden möchte, sollten Sie das App-Thema in styles.xml ändern , zum Beispiel:
Das Problem ist, dass Sie möglicherweise ein AppCompat-Design verwenden .
Wenn Sie andererseits android.support.v7.app.ActionBar verwenden und Ihre Aktivität mit AppCompatActivity erweitern möchten , müssen Sie ein AppCompat-Design verwenden , um dieses Problem zu vermeiden, zum Beispiel:
Hoffe das hilft.
quelle
AppCompatActivity
stattActivity
wie in dieser Antwort erweitern .Wenn Sie appcompatActivity erweitern, verwenden Sie
und wenn Sie ActionBar erweitern, verwenden Sie
Vergessen Sie nicht, diese Funktion in oncreate aufzurufen, nachdem Sie die Symbolleiste / Aktionsleiste initialisiert haben
quelle
Ich denke, was Sie tun möchten, ist getActivity () zu besetzen. Beispielsweise:
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Dies müssen Sie mit den neuen Support-Bibliotheken tun. AppCompatActivity hat ActionBarActivity ersetzt.
quelle
Versuchen Sie hier zu überprüfen
res >> values >> styles.xml
Stellen Sie sicher, dass es keinen solchen Code gibt
Wenn es solchen Code gibt, können Sie ihn für eine Weile deaktivieren oder löschen
quelle
<item name="windowNoTitle">true</item>
, was entfernt werden musste.android:theme="@style/AppTheme.NoActionBar"
aus dem<avticity>
Tag auf AndroidManifest.xmlBei Verwendung muss AppCompatActivity aufrufen
Vor
getSupportActionBar()
quelle
Die Aufwärts-Schaltfläche wird normalerweise für Aktivitäten auf niedriger Ebene aktiviert. In Ihrem Manifest sehe ich nur die Hauptaktivität. Ich halte es nicht für sinnvoll, den Up-Button für die Hauptaktivität zu aktivieren. Erstellen Sie eine Aktivität und fügen Sie dann im Manifest das Attribut parentActivityName hinzu. Aktivieren Sie dann die Schaltfläche nach oben in der onCreate-Methode der Aktivität.
Das sollte helfen.
https://developer.android.com/training/appbar/up-action.html
quelle
In meinem Fall liegt das daran
styles.xml
, dass das falsche übergeordnete Thema festgelegt wurde, dh dasNoActionBar
Thema ist natürlichgetSupportActionbar()
null:Es wurde in etwas anderes geändert, um es zu beheben:
quelle
Versuchen Sie diese Hoffnung, es wird funktionieren, mein Code funktioniert gut
quelle
in dieser Zeile in Ihrer Aktivität:
benutze das:
*
ist deine Tätigkeitquelle
In meinem Fall hatte ich den gleichen Fehler, aber mein Fehler war, dass ich meine Symbolleiste nicht deklariert habe.
Bevor ich getSupportActionBar verwenden konnte, musste ich meine Symbolleiste finden und die Aktionsleiste festlegen
quelle
Ich weiß, dass diese Frage etwas Altes ist. Dies kann jedoch vielen helfen, die dieses Problem darstellen.
Überprüfen Sie zur Lösung dieses Problems, ob ein Nullpunkt vorliegt. Wenden Sie dann die entsprechende Konfiguration an:
quelle
Wenn Sie android.app.ActionBar und android.app.Activity verwenden, sollten Sie das App-Thema im Anwendungs-Tag ändern:
quelle
Stellen Sie für alle anderen Benutzer mit BaseActivity und einem untergeordneten Element sicher, dass super.onCreate () zuerst aufgerufen wird, bevor Sie etwas tun. Die alte Aktivität würde funktionieren, wenn Sie anschließend super.onCreate () aufrufen würden.
Kind erweitert Aktivität - könnte super anrufen, nachdem Sie Sachen gemacht haben
Kind erweitert AppCompatActivity - du musst zuerst super anrufen
quelle
Für diejenigen, die dieses Problem noch haben, wurde mein Problem in der Datei AndroidManifest.xml behoben. Wo es heißt
<activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">
, müssen Sie es entfernenNoActionBar
und<activity android:name=".MainActivity" android:theme="@style/AppTheme">
erstellen, da die App mit der Einstellung NoActionBar nicht weiß, ob sie eine Aktionsleiste möchte, wenn Sie eine in MainActivity.java aufrufenquelle
Ich habe einmal den gleichen Fehler erhalten, eine Vorlage für eine Standardsymbolleiste (toolbar.xml) erstellt und dann in einer anderen Ansicht eine reduzierbare Symbolleiste erstellt.
Ich musste die reduzierbare Symbolleiste zu einer Ansicht hinzufügen, die einige Informationen des Benutzers anzeigt (wie WhatsApp), aber die Methode findViewById verwies auf die Standardsymbolleiste (ID-Symbolleiste), nicht auf die reduzierbare Symbolleiste (auch ID-Symbolleiste). Ja, schrieb ich Die gleiche ID für beide Symbolleisten. Als ich versuchte, auf die Aktivität zuzugreifen, stürzte die App ab und zeigte mir den Fehler.
Ich habe den Fehler behoben, indem ich die ID der reduzierbaren Symbolleiste in id: col_toolbar geändert habe. Der Fehler ist verschwunden und meine App hat einwandfrei funktioniert
quelle
Sie sollten diesen versuchen. Ich denke es wird funktionieren.
quelle
Die beste Lösung ist dies in Ihrer Oncreate-Methode
gefolgt von einer neuen Klasse
quelle
Bitte nach hinzufügen
Toolbar
quelle
Ich bin neu in der Android App-Entwicklung. Ich habe diesen Fehler festgestellt und fast 5 Stunden damit verbracht, ihn zu beheben. Schließlich fand ich heraus, dass das Folgende die Hauptursache für dieses Problem war. Wenn jemand in Zukunft erneut mit diesem Problem konfrontiert wird, lesen Sie dies bitte durch.
Ich habe versucht , ein Haus Aktivitäten mit einem Video - Hintergrund zu erstellen, für die ich das übergeordnete Thema ändern musste von der Standardeinstellung
Theme.AppCompat.Light.DarkActionBar
zuTheme.AppCompat.Light.NoActionBar
. Dies funktionierte gut für die Home-Aktivität, aber wenn ich eine neue Schaltfläche mit einem Onclicklistener einstelle, um zu einer anderen Aktivität zu navigieren, bei der ich einen benutzerdefinierten Text für die Aktionsleiste festgelegt habe, wird dieser Fehler ausgelöst.Am Ende habe ich also zwei Themen erstellt und sie wie folgt den Aktivitäten zugewiesen.
Ich habe die folgenden Änderungen vorgenommen, um den Fehler zu beheben.
Definieren der Themen in styles.xml
Verknüpfen der Aktivitäten mit ihren jeweiligen Themen in
AndroidManifest.xml
quelle
Wenn Sie auf diesen Fehler stoßen
Benutz einfach
quelle
Wann immer ein solcher Fehler auftritt. Versuchen Sie, folgende Dinge zu überprüfen
Überprüfen Sie, welche Art von Aktivität verwendet wird, ob es sich um eine einfache android.app-Aktivität oder eine AppCompatActivity oder eine ActionBarActivity usw. handelt.
Überprüfen Sie, ob Ihr erweiterter Aktivitätstyp unter die kompatible Kategorie fällt
Beispiel android.app-basierte Aktivitäten / Fragmente sind keine appCompat-Typen, während android.support.v4.app.Fragment oder android.support.v4.app.ActivityCompat appCompat-basiert sind
Wenn es unter appCompat fällt, verwenden wir getSupportActionBar (). Andernfalls können wir für android.app-Typen getActionBar () verwenden.
Beispiel: Wenn in der Manifestdatei das angewendete Thema "android: theme =" @ android: style / Theme.Holo.Dialog "lautet, funktioniert getActionBar ()
Wenn das für die Aktivität im Manifest angewendete Thema jedoch wie folgt lautet: android: theme = "@ style / Theme.AppCompat.Light", müssen Sie getSupportActionBar () verwenden.
quelle
Wenn Sie eine neue Symbolleiste erstellt haben, überprüfen Sie, ob Sie die Methode setSupportActionBar () angewendet haben. es wird dir definitiv helfen
quelle
Versuchen Sie Folgendes:
An Stelle von:
quelle
getSupportActionBar()
wenn Sie bereits das Ergebnis inactionBar
Variable haben? Beide Varianten sind schlecht.