Mam w res/layout/main.xml
tym te elementy i inne:
<some.package.MyCustomView android:id="@+id/foo" (some other params) />
<TextView android:id="@+id/boring" (some other params) />
W moim działaniu onCreate robię to:
setContentView(R.layout.main);
TextView boring = (TextView) findViewById(R.id.boring);
// ...find other elements...
MyCustomView foo = (MyCustomView) findViewById(R.id.foo);
if (foo == null) { Log.d(TAG, "epic fail"); }
Pozostałe elementy zostały pomyślnie znalezione, ale foo
zwracają wartość null. MyCustomView ma konstruktora, MyCustomView(Context c, AttributeSet a)
a Log.d(...)
na końcu tego konstruktora pojawia się pomyślnie w logcat tuż przed „epicką porażką”.
Dlaczego jest foo
zerowa?
(MyCustomView) foo = findViewById(R.id.foo);
wyglądaćMyCustomView foo = (MyCustomView) findViewById(R.id.foo);
?Mam ten sam problem, ponieważ w moim niestandardowym widoku nadpisałem konstruktora, ale wywołałem superkonstruktor bez parametru attrs. To jest kopiuj wklej)
Moja poprzednia wersja konstruktora:
Teraz mam:
I to działa!
źródło
Miałem ten sam problem. Mój błąd był taki: napisałem
a ponieważ użyłem inflatera do „załadowania” widoku z pliku XML, ostatnia linia była błędna. Aby go rozwiązać, musiałem napisać:
Napisałem swoje rozwiązanie na wypadek, gdyby ktoś miał ten sam problem.
źródło
Wydaje się, że jest wiele powodów. Po prostu użyłem „Wyczyść ...” w Eclipse, aby rozwiązać podobny problem. (FindViewByID działał wcześniej iz jakiegoś powodu zaczął zwracać wartość null.)
źródło
Ten sam problem, ale inne rozwiązanie: nie dzwoniłem
ZANIM próbowałem znaleźć widok taki, jak tutaj podano
źródło
Jeśli masz wiele wersji układu (w zależności od gęstości ekranu, wersji SDK), upewnij się, że wszystkie zawierają element, którego szukasz.
źródło
W moim przypadku findViewById zwracał wartość null, ponieważ mój widok niestandardowy wyglądał mniej więcej tak w głównym kodzie XML:
<com.gerfmarquez.seekbar.VerticalSeekBar android:id="@+id/verticalSeekBar" android:layout_width="wrap_content" android:layout_height="fill_parent" />
i dowiedziałem się, że kiedy dodałem rzeczy xmlns, działało to tak:
<com.gerfmarquez.seekbar.VerticalSeekBar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/verticalSeekBar" android:layout_width="wrap_content" android:layout_height="fill_parent" />
źródło
Upewnij się, że
setContentView(R.layout.main)
instrukcja wywołuje przedfindViewById(...)
instrukcją;źródło
U mnie problem został rozwiązany, gdy dodałem folder res do źródła w ścieżce kompilacji Java w ustawieniach projektu.
źródło
Napotkałem ten sam problem jakiś czas temu, kiedy dodałem niestandardowy widok za pomocą układu XML, a następnie próbowałem dołączyć wywołanie zwrotne w innym miejscu w aplikacji ...
Utworzyłem widok niestandardowy i dodałem go do mojego „layout_main.xml”
W głównym ćwiczeniu chciałem dołączyć wywołania zwrotne i uzyskać odniesienia do elementów interfejsu użytkownika z XML.
Initilizer nie robił nic wymyślnego, ale wszelkie zmiany, które próbował wprowadzić w widoku niestandardowym (MUIComponent) lub innych niestandardowych elementach interfejsu użytkownika, po prostu nie pojawiały się w aplikacji.
Różnica między „badInst” a „goodInst” jest następująca:
źródło
Przydarzyło mi się to z niestandardowym komponentem do Wear, ale jest to ogólna rada. Jeśli używasz Stubu (takiego jak ja
WatchViewStub
), nie możesz po prostu wykonać połączenia wfindViewById()
dowolnym miejscu. Wszystko wewnątrz kikuta musi być najpierw napompowane, co nie dzieje się późniejsetContentView()
. Dlatego powinieneś napisać coś takiego, aby poczekać, aż to się stanie:źródło
Mój problem to literówka.
android.id
Zamiast tego napisałem (kropka)android:id
. : PNajwyraźniej nie ma sprawdzania składni w moim niestandardowym komponencie xml. :(
źródło
Miałem ten sam problem.
Miałem układ z kilkoma dziećmi. Z konstruktora jednego z nich próbowałem uzyskać odniesienie (za pomocą context.findViewById) do innego dziecka. To nie działało, ponieważ drugie dziecko zostało zdefiniowane dalej w układzie.
Rozwiązałem to w ten sposób:
Dobrze by działało, gdyby kolejność dzieci była odwrotna, ale myślę, że generalnie powinno się to robić tak jak powyżej.
źródło
findViewById
w konstruktorze aView
, ale raczej umieścić kod inicjalizacyjny wOnFinishInflate
?findViewById()
Metoda czasami powracanull
, gdy korzeń układ maandroid:id
atrybut. Kreator Eclipse do generowania pliku xml układu nie generuje automatycznieandroid:id
atrybutu dla elementu głównego.źródło
W moim przypadku widok był u rodzica, a NIE w widoku, który próbowałem wywołać. Więc w widoku dziecka musiałem zadzwonić:
źródło
Opcja „czysty” zadziałała dla mnie.
W moim przypadku główną przyczyną jest to, że kod źródłowy znajduje się w udziale sieciowym, a moja stacja robocza i serwer plików nie zostały poprawnie zsynchronizowane i przesunęły się o 5 sekund. Sygnatury czasowe plików utworzonych przez Eclipse pochodzą z przeszłości (ponieważ są przypisywane przez serwer plików) i zapisują zegar stacji roboczej, co powoduje, że Eclipse nieprawidłowo rozwiązuje zależności między plikami wygenerowanymi a źródłowymi. W tym przypadku „czyste” wydaje się działać, ponieważ wymusza całkowitą przebudowę zamiast przyrostowej kompilacji, która opiera się na niewłaściwych sygnaturach czasowych.
Po naprawieniu ustawień NTP na mojej stacji roboczej problem nigdy więcej nie wystąpił. Bez odpowiednich ustawień NTP działo się to co kilka godzin, ponieważ zegary szybko dryfują.
źródło
Aby dodać kolejny trywialny błąd do odpowiedzi, na które należy zwrócić uwagę:
Sprawdź, czy faktycznie edytujesz właściwy plik XML układu ...
źródło
Miałem ten sam problem, ponieważ zapomniałem zaktualizować identyfikator widoku we wszystkich moich folderach układu.
źródło