To jest kanoniczne pytanie dotyczące problemu często publikowanego w witrynie StackOverflow.
Postępuję zgodnie z tutorialem. Utworzyłem nową aktywność za pomocą kreatora. Otrzymuję NullPointerException
, próbując wywołać metodę na View
s uzyskanych findViewById()
w mojej aktywności onCreate()
.
Aktywność 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();
}
}
Układ 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()
narootView
i nie na aktywności.Wypróbuj
OnStart()
metodę i po prostu użyjlub zadeklaruj dowolny widok przy użyciu
getView().findViewById
metody w programieonStart()
Zadeklaruj, że odbiornik kliknięć ma być wyświetlany według
anyView.setOnClickListener(this);
źródło
Spróbuj przenieść dostęp do widoków do metody onViewCreated fragmentu, ponieważ czasami, gdy próbujesz uzyskać dostęp do widoków w metodzie onCreate, nie są one renderowane w czasie wynikającym z wyjątku wskaźnika o wartości null.
źródło
Zgoda, jest to typowy błąd, ponieważ ludzie często nie rozumieją, jak działają fragmenty, gdy rozpoczynają pracę nad programowaniem na Androida. Aby uniknąć nieporozumień, stworzyłem prosty przykładowy kod, który pierwotnie opublikowałem w aplikacji jest zatrzymany w emulatorze Androida , ale opublikowałem go również tutaj.
Oto przykład:
activity_container.xml:
Przykładowy fragment:
fragment_example.xml:
Powinien to być prawidłowy przykład, pokazujący, jak można użyć działania do wyświetlenia fragmentu i obsługi zdarzeń w tym fragmencie. A także jak komunikować się z działaniem zawierającym.
źródło
Otto
do komunikacji zamiast wywołań zwrotnych i używaćButterknife
do wstrzykiwania widoków.Widok „coś” jest fragmentaryczny, a nie aktywny, więc zamiast uzyskać do niego dostęp w działaniu, należy uzyskać do niego dostęp w klasie fragmentu, takiej jak
W PlaceholderFragment.class
źródło
Próbujesz uzyskać dostęp do elementów UI w,
onCreate()
ale jest za wcześnie, aby uzyskać do nich dostęp, ponieważ widoki fragmentów można tworzyć wonCreateView()
metodzie. AonActivityCreated()
metoda jest niezawodna w obsłudze wszelkich działań na nich, ponieważ aktywność jest w tym stanie w pełni załadowana.źródło
Dodaj następujące elementy w swoim pliku activity_main.xml
źródło
Ponieważ zadeklarowałeś swój widok w
fragment_main.xml
, przenieś ten fragment kodu, w którym otrzymujesz NPE wonCreateView()
metodzie fragmentu. To powinno rozwiązać problem.źródło
w zamieszczonym kodzie powyżej w pytaniu jest problem: używasz R.layout.activity_main w metodzie oncreate, ale nazwa pliku xml to "fragment_main.xml", co oznacza, że próbujesz uzyskać widok pliku fragment_main.xml który nie jest wyświetlany, więc daje wyjątek zerowego wskaźnika. zmień kod na przykład:
źródło
Musisz pamiętać, że ważne jest to, że: NullPointerException występuje, gdy zadeklarowałeś swoją zmienną i próbujesz odzyskać jej wartość przed przypisaniem jej wartości.
źródło
Użyj metody onViewCreated () zawsze, gdy używasz lub wywołujesz widoki z fragmentów.
źródło
Mam to samo
NullPointerException
inicjowanie odbiornika po wywołaniufindViewById()
onCreate()
ionCreateView()
metodach.Ale kiedy używam,
onActivityCreated(Bundle savedInstanceState) {...}
to działa. Więc mogłem uzyskać dostęp doGroupView
i ustawić mojego słuchacza.Mam nadzieję, że będzie to pomocne.
źródło
Najpopularniejsza biblioteka do wyszukiwania widoków, z której korzysta prawie każdy programista.
Nóż do masła
Jak mogę, ich odpowiedzi jest wystarczających, wyjaśniających znalezienie poglądów za pomocą odpowiedniej metodologii. Ale jeśli jesteś programistą Androida i często kodujesz, możesz użyć noża do masła, który oszczędza dużo czasu na znajdowaniu widoków i nie musisz pisać do niego kodu. W 2-3 krokach możesz znaleźć widoki w milisekundach .
Dodaj zależność na poziomie aplikacji:
Dodaj wtyczkę do noża do masła:
Następnie wyszukaj Android ButterKnife Zelezny i zainstaluj wtyczkę, zrestartuj swoje studio i gotowe.
Teraz po prostu przejdź do metody Oncreate swojej aktywności i kliknij prawym przyciskiem myszy swoją nazwę_układu i dotknij przycisku generowania i wybierz opcję wstrzyknięcia Butterknife, a odniesienia do widoków zostaną automatycznie utworzone, jak wspomniano poniżej:
źródło