Dies ist eine kanonische Frage für ein Problem, das häufig auf StackOverflow veröffentlicht wird.
Ich folge einem Tutorial. Ich habe mit einem Assistenten eine neue Aktivität erstellt. Ich bekomme NullPointerException
beim Versuch , eine Methode zu nennen View
s mit erhielt findViewById()
in meiner Tätigkeit onCreate()
.
Aktivität onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View something = findViewById(R.id.something);
something.setOnClickListener(new View.OnClickListener() { ... }); // NPE HERE
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
Layout XML ( fragment_main.xml
):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="packagename.MainActivity$PlaceholderFragment" >
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/something" />
</RelativeLayout>
findViewById()
aufrootView
und nicht auf Aktivität.Probieren Sie die
OnStart()
Methode aus und verwenden Sie sie einfachoder Deklarieren Sie eine Ansicht mit der
getView().findViewById
Methode inonStart()
Deklarieren Sie den Klick-Listener in der Ansicht von
anyView.setOnClickListener(this);
quelle
Versuchen Sie, Ihre Zugriffsansichten auf die Fragmentmethode onViewCreated zu verschieben, da diese manchmal beim Versuch, auf die Ansichten in der Methode onCreate zuzugreifen, zum Zeitpunkt der resultierenden Nullzeigerausnahme nicht gerendert werden.
quelle
Einverstanden ist dies ein typischer Fehler, da die Leute oft nicht wirklich verstehen, wie Fragmente funktionieren, wenn sie anfangen, an der Android-Entwicklung zu arbeiten. Um Verwirrung zu vermeiden, habe ich einen einfachen Beispielcode erstellt, den ich ursprünglich auf Application gepostet habe und der im Android-Emulator gestoppt ist gepostet habe. Er , aber ich habe ihn auch hier gepostet.
Ein Beispiel ist das Folgende:
activity_container.xml:
BeispielFragment:
fragment_example.xml:
Und das sollte ein gültiges Beispiel sein. Es zeigt, wie Sie eine Aktivität verwenden können, um ein Fragment anzuzeigen und Ereignisse in diesem Fragment zu behandeln. Und auch, wie man mit der enthaltenen Aktivität kommuniziert.
quelle
Otto
für die Kommunikation anstelle von Rückrufen verwenden undButterknife
zum Einfügen von Ansichten verwenden sollten.Die Ansicht "etwas" befindet sich in einem Fragment und nicht in einer Aktivität. Anstatt in einer Aktivität darauf zuzugreifen, müssen Sie in der Fragmentklasse wie darauf zugreifen
In PlaceholderFragment.class
quelle
Sie versuchen, auf UI-Elemente in der
onCreate()
zuzugreifen, aber es ist zu früh, um darauf zuzugreifen, da in FragmentansichtenonCreateView()
Methoden erstellt werden können. DieonActivityCreated()
Methode ist zuverlässig, um alle Aktionen auf ihnen auszuführen, da die Aktivität in diesem Zustand vollständig geladen ist.quelle
Fügen Sie Folgendes in Ihre activity_main.xml ein
quelle
Da Sie Ihre Ansicht in deklariert haben
fragment_main.xml
, verschieben Sie den Code, in dem Sie die NPE in deronCreateView()
Methode des Fragments erhalten. Dies sollte das Problem lösen.quelle
Im oben angegebenen Code in der Frage gibt es ein Problem: Sie verwenden R.layout.activity_main in der Methode oncreate, aber der Name der XML-Datei lautet "fragment_main.xml". Dies bedeutet, dass Sie versuchen, die Ansicht der Datei fragment_main.xml abzurufen Dies wird nicht angezeigt, sodass eine Nullzeigerausnahme vorliegt. Ändern Sie den Code wie folgt:
quelle
Beachten Sie Folgendes: NullPointerException tritt auf, wenn Sie Ihre Variable deklariert haben und versuchen, ihren Wert abzurufen, bevor Sie ihr einen Wert zuweisen.
quelle
Verwenden Sie die onViewCreated () -Methode, wenn Sie Ansichten aus Fragmenten verwenden oder aufrufen.
quelle
Ich habe die gleiche
NullPointerException
Initialisierung eines Listeners nach dem AnruffindViewById()
onCreate()
undonCreateView()
Methoden.Aber wenn ich das benutzt habe,
onActivityCreated(Bundle savedInstanceState) {...}
funktioniert es. So konnte ich auf die zugreifenGroupView
und meinen Listener einstellen.Ich hoffe es ist hilfreich.
quelle
Beliebteste Bibliothek zum Auffinden von Ansichten, die von fast jedem Entwickler verwendet wird.
Buttermesser
Wie ich kann, gibt es genug Antworten, um das Finden von Ansichten mit der richtigen Methodik zu erklären. Wenn Sie jedoch täglich Android-Entwickler und -Code sind, können Sie ein Buttermesser verwenden, das viel Zeit beim Suchen von Ansichten spart und für das Sie keinen Code schreiben müssen. In 2-3 Schritten können Sie Ansichten in Millisekunden finden .
Abhängigkeit in Gradle auf App-Ebene hinzufügen:
Plugin für Buttermesser hinzufügen:
Dann suchen Sie nach Android ButterKnife Zelezny und installieren Sie das Plugin und starten Sie Ihr Studio neu und Sie sind fertig.
Gehen Sie jetzt einfach zur Oncreate-Methode Ihrer Aktivität und klicken Sie mit der rechten Maustaste auf Ihren Layoutnamen. Tippen Sie auf die Schaltfläche "Generieren" und wählen Sie die Option "Buttermesser-Injektion". Ihre Ansichtsreferenzen werden automatisch wie unten erwähnt erstellt:
quelle