Mam bardzo frustrujący błąd, którego nie potrafię wyjaśnić. Stworzyłem aplikację na Androida, która używa, Android AppCompat
aby była kompatybilna ze starszymi wersjami. Oto mój główny plik układu aktywności:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
the container. -->
<fragment android:id="@+id/navigation_drawer"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:name="com.fragment.NavigationDrawerFragment" />
</android.support.v4.widget.DrawerLayout>
A oto główny kod mojej działalności:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Główny problem polega na tym, że powyższy kod działa płynnie na prawie urządzeniach (urządzeniach stymulowanych lub niektórych rzeczywistych). Ale kiedy uruchomię go na Samsungu S3. Zauważa ten błąd:
java.lang.RuntimeException: Unable to start activity ComponentInfo{view.MainActivity}: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
at android.app.ActivityThread.access$700(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4856)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316)
at android.app.Activity.setContentView(Activity.java:1901)
at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)
Proszę powiedz mi, jak naprawić błąd, dzięki :)
Odpowiedzi:
Po długim czasie debugowania rozwiązałem ten problem. (Chociaż nadal nie mogę wyjaśnić, dlaczego). Że zmieniam właściwość
android:name
naclass
. (chociaż w dokumencie Androida mówią, że te właściwości są takie same, ale działa !!!)Powinien więc zmienić się z:
do
Tak więc nowy układ powinien wyglądać następująco:
Mam nadzieję, że to pomoże :)
źródło
android:id
naclass
) zadziałała dla mnie. Dostałam też ostrzeżenie Lint do zmianFragment
dofragment
, co ja.name
na.class
Kilku użytkowników zgłosiło tę awarię, ale nie mogę jej powtórzyć!Nie mogłem rozwiązać problemu na podstawie udzielonych odpowiedzi. Wreszcie zmieniłem to:
do tego :
,
i to działa.
Jeśli używasz go wewnątrz fragmentu, użyj getChildFragmentManager zamiast getSupportFragmentManager .
źródło
TL / DR : Wystąpił wyjątek podczas tworzenia fragmentu, do którego odwołuje się plik XML układu wyższego poziomu. Ten wyjątek spowodował niepowodzenie inflacji układu wyższego poziomu, ale początkowy wyjątek nie został zgłoszony ; tylko błąd inflacji wyższego poziomu pojawia się w śladzie stosu. Aby znaleźć główną przyczynę, musisz złapać i zarejestrować początkowy wyjątek .
Początkową przyczyną błędu może być wiele różnych rzeczy, dlatego jest tu tak wiele różnych odpowiedzi, które rozwiązały problem dla każdej osoby. Dla niektórych, to mieliśmy do czynienia z
id
,class
lubname
atrybutów. W przypadku innych było to spowodowane problemem z uprawnieniami lub ustawieniami kompilacji. Dla mnie to nie rozwiązało problemu; zamiast tego istniał zasób możliwy do wyciągnięcia, który istniał tylko wdrawable-ldrtl-xhdpi
, a nie w odpowiednim miejscu, takim jakdrawable
.Ale to tylko szczegóły. Ogólny problem polega na tym, że komunikat o błędzie, który pojawia się w logcat, nie opisuje wyjątku, od którego wszystko się zaczęło. Gdy kod XML układu wyższego poziomu odwołuje się do fragmentu,
onCreateView()
wywoływany jest fragment . Gdy wyjątek występuje w plikuonCreateView()
(na przykład podczas wypełniania kodu XML układu fragmentu) powoduje niepowodzenie inflacji XML układu wyższego poziomu. Ten błąd inflacji wyższego poziomu jest zgłaszany jako wyjątek w dziennikach błędów. Ale początkowy wyjątek nie wydaje się wędrować w górę łańcucha na tyle dobrze, aby został zgłoszony.Biorąc pod uwagę tę sytuację, pytanie brzmi, jak ujawnić początkowy wyjątek, gdy nie pojawia się w dzienniku błędów.
Rozwiązanie jest całkiem proste: umieść blok
try
/catch
wokół zawartości fragmentuonCreateView()
, awcatch
klauzuli zapisz wyjątek:Może nie być oczywiste, która klasa fragmentu ma
onCreateView()
to zrobić, w takim przypadku należy to zrobić dla każdej klasy fragmentu, która jest używana w układzie, który spowodował problem. Na przykład w przypadku OP kod aplikacji, w której wystąpił wyjątek, toktóry jest
Musisz więc wychwycić wyjątki we
onCreateView()
wszystkich fragmentach, do których odwołuje się układactivity_main
.W moim przypadku okazał się wyjątek głównej przyczyny
Ten wyjątek nie pojawił się w dzienniku błędów, dopóki go nie złapałem
onCreateView()
i nie zarejestrowałem go jawnie. Po zarejestrowaniu problem był dość łatwy do zdiagnozowania i naprawienia ( z jakiegoś powodudetails_view.xml
istniał tylko wldrtl-xhdpi
folderze). Kluczem był wychwycenie wyjątku, który był źródłem problemu, i ujawnienie go.Nie zaszkodzi robienie tego jako schematu we wszystkich
onCreateView()
metodach twoich fragmentów . Jeśli jest tam nieprzechwycony wyjątek, spowoduje to zawieszenie działania. Jedyna różnica polega na tym, że jeśli złapiesz i zalogujesz się do wyjątkuonCreateView()
, nie dowiesz się, dlaczego tak się stało.PS Właśnie zdałem sobie sprawę, że ta odpowiedź jest związana z @ DaveHubbard's, ale używa innego podejścia do znalezienia głównej przyczyny (logowanie vs. debugger).
źródło
Miałem ten sam problem, problem, bezskutecznie wypróbowałem wszystkie odpowiedzi w tym wątku. Moje rozwiązanie polegało na tym, że nie dodałem identyfikatora w pliku XML działania. Nie sądziłem, że to ma znaczenie, ale miało.
Więc w Activity XML miałem:
Ale powinienem był:
Jeśli ktoś byłby szczęśliwy mogąc skomentować, dlaczego tak jest, mam wszystkie uszy, do innych, mam nadzieję, że to pomoże.
źródło
Może nie być już potrzebne, ale jeśli dla dalszych czytelników będzie to pomocne. Mam dokładnie to samo
android.view.InflateException:...Error inflating class fragment
. Uwzględniłem wszystkie odpowiednie biblioteki. Rozwiązany przez dodanie jeszcze jednego uprawnienia użytkownika wAndroidManifest.xml
pliku, tj<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Btw biegałem
Android Studio 0.8.9 on Ubuntu 12.04.
źródło
Mam ten sam problem, ponieważ nie zaimplementowałem słuchacza. Zobacz poniższy kod z
/*Add This!*/
.FYI, moja klasa fragmentów wygląda mniej więcej tak:
Edytować:
Zauważyłem również ten sam komunikat o błędzie w innych okolicznościach, gdy istnieje wyjątek w
onCreate
funkcjiFragment
. Mam coś takiego:Ponieważ ponownie wykorzystuję ten fragment, całkowicie zapomniałem ustawić argumenty. Wtedy wynik
getArguments()
jestnull
. Oczywiście otrzymujęnull
tutaj wyjątek wskaźnika. Zasugeruję, abyś również uważał na takie błędy.źródło
Czy twój NavigationDrawerFragment rozszerza android.support.v4.app.Fragment? Innymi słowy, czy importujesz właściwy pakiet?
źródło
Miałem też ten problem. Rozwiązałem to, zastępując import w
MainActivity
iNavigationDrawerFragment
Z
Do
Zaktualizowałem,
MainActivity
aby rozszerzyćActionBarActivity
zamiast AktywnościUżyj również
ActionBar actionBar = getSupportActionBar();
aby uzyskać ActionBarZaktualizowałem następującą funkcję w
NavigationDrawerFragment
źródło
Zmierzyłem się z tym problemem i rozwiązałem go, używając następujących kodów. Zacząłem transakcję fragmentaryczną za pomocą menedżera ds.
układ:
tak zacząłem transakcję fragmentaryczną:
Poniższy kod wyjaśnia, w jaki sposób usunąłem fragment, który został dodany przy użyciu childfragmentmanger.
źródło
Miałem podobne problemy z włączaniem i wyłączaniem. Komunikat o błędzie często zawiera bardzo mało szczegółów, niezależnie od rzeczywistej przyczyny. Ale znalazłem sposób, aby uzyskać więcej przydatnych informacji. Okazuje się, że wewnętrzna klasa systemu Android „LayoutInflater.java” (w pakiecie android.view) ma metodę „inflate”, która ponownie zgłasza wyjątek, ale nie rejestruje szczegółów, przez co tracisz informacje o przyczynie.
Użyłem AndroidStudio i ustawiłem punkt przerwania w linii LayoutInflator 539 (w wersji, w której pracuję), która jest pierwszą linią bloku catch dla ogólnego wyjątku w tej metodzie `` inflate '':
Jeśli spojrzysz na „e” w debugerze, zobaczysz pole „przyczyna”. Może być bardzo pomocny, dając ci wskazówkę, co naprawdę się wydarzyło. W ten sposób na przykład stwierdziłem, że element nadrzędny dołączonego fragmentu musi mieć identyfikator, nawet jeśli nie jest używany w kodzie. Albo że TextView miał problem z wymiarem.
źródło
Na wypadek, gdyby ktoś tego potrzebował. Założenia: telefon urządzenia podłączony do kabla USB i odczyt IDE w celu uruchomienia aplikacji. Przejdź do wiersza poleceń, aby określić problem: wprowadź adb logcat
Następnie uruchom aplikację z IDE. Będziesz wyjątkiem.
W moim przypadku: wdrażałem aplikację na Androida w wersji 2.3 na urządzeniu mobilnym, które nie obsługuje widżetu „Space”
źródło
Ten problem pojawia się, gdy masz niestandardową klasę, która rozszerza inną klasę (w tym przypadku widok) i nie importuje wszystkich konstruktorów wymaganych przez klasę.
Na przykład: klasa publiczna CustomTextView rozszerza TextView {}
Ta klasa miałaby 4 konstruktory i jeśli przegapisz którykolwiek z nich, może się zawiesić. Właściwie przegapiłem ostatni, który był używany przez Lollipop, dodał tego konstruktora i działał dobrze.
źródło
musimy również dodać następujące elementy w build.gradle (aplikacja)
za każdym razem, gdy używamy nowych układów lub nowych funkcji projektu. mam nadzieję, że to ci pomoże.
źródło
Jak wspomniano w poprzednim poście,
zmień nazwę
do
Jednak dla mnie to nie zadziałało. Po prostu użyłem nazwy klasy bez części com.fragment i voila zadziałało. Więc zmień to ostatecznie na
źródło
Ponieważ żadna z odpowiedzi nie pomogła mi, zdecydowałem się uruchomić aplikację w trybie debugowania, poruszając się po każdym wierszu onCreateView w moim fragmencie (w twoim przypadku NavigationDrawerFragment). Zauważyłem, że ten fragment miał problemy z zawyżaniem z powodu wyjątku NullPointerException. Na przykład
Tutaj mySeekBar ustawiono na null (ponieważ przegapiłem dodanie kontrolki w odpowiednim układzie) i następna linia trafiła do NPE, która wyszła jako InflateException. Ponadto, zgodnie z powyższą sugestią, zmień nazwę android: name na class.
Ten problem może powstać z różnych powodów wymienionych powyżej. Poleciłbym proces debugowania wiersz po wierszu, aby wiedzieć, co jest nie tak.
źródło
onCreateView()
metodzie fragmentu ?Dla niektórych z was, którzy nadal nie znaleźli rozwiązania tego problemu, w moim przypadku stało się to, ponieważ miałem problem z OOM (Out of Memory). Może się to zdarzyć, gdy na przykład masz wyciek pamięci w aplikacji, gdy używasz jej przez długi czas. W moim śladzie stosu był to główny powód.
źródło
Nie wiem, czy to pomoże.
Miałem ten problem z TextView, który miałem w układzie, który próbowałem nadmuchać ( android.view.InflateException: Binary XML file line # 45: Error inflating class TextView ).
Ustawiłem następujący atrybut XML android: textSize = "? Android: attr / textAppearanceLarge", który nie pozwalał na zawyżenie układu.
Nie wiem dokładnie, dlaczego ( wciąż jestem trochę nowy w Androidzie - mniej niż rok doświadczenia ), może mieć coś wspólnego z wywoływaniem atrybutów systemu, idk, wszystko, co wiem, to jak tylko użyłem zwykłego starego @ dimen / md_text_16sp ( co mam w zwyczaju ), problem rozwiązany :)
Mam nadzieję że to pomoże...
źródło
Widget.Design.TextInputLayout
:. stackoverflow.com/questions/19874882/…Miałem to na urządzeniu 4.4.2, ale 5+ było w porządku. Przyczyna: w ramach inicjalizacji widoku niestandardowego
TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)
tworzyłem plik , czyli API 21+.Android Studio 2.1 nie narzeka na to, mimo że jest opatrzony adnotacją
TargetApi(21)
. Najwyraźniej Android Studio 2.2 naprawi to i poprawnie pokaże to jako błąd.Mam nadzieję, że to komuś pomoże.
źródło
Trochę się spóźniłem na imprezę, ale żadna z tych odpowiedzi nie pomogła mi w moim przypadku. Używałem mapy Google jako SupportMapFragment i PlaceAutocompleteFragment zarówno w moim fragmencie. Jak wszystkie odpowiedzi wskazywały na fakt, że problem polega na tym, że SupportMapFragment jest mapą do odtworzenia i ponownego narysowania.
Ale miałem też problem z PlaceAutocompleteFragment. Oto działające rozwiązanie dla tych, którzy borykają się z tym problemem z powodu SupportMapFragment i SupportMapFragment
W onDestroyView wyczyść SupportMapFragment i SupportMapFragment
źródło
Po długich próbach w ten sposób rozwiązałem problem, mimo że żadna z powyższych odpowiedzi nie mogła.
AppCompatActivity
swojąMain
aktywność zamiastActivity
.android:theme="@style/Theme.AppCompat.Light"
do swojego<Activity..../>
wAndroidManifest.xml
W swojej
NavigationDrawerFragment
klasie zmień swojeActionBar
instancje naEDYTOWAĆ
To powinno być spójność pomiędzy Aktywny i Układ . Jeśli układ ma jeden z motywów AppCompat, taki jak
Theme.AppCompat.Light
, Twoja aktywność powinnaextends AppCompatActivity
.Chciałem mieć ikonę burgera i szufladę nawigacji, która wygląda jak aplikacja Gmail na Androida , ale skończyło się na brzydkiej szufladzie nawigacji . Wszystko to dlatego, że
extends Activity
zamiast wszystkich moich klasAppCompatActivity
.Ponownie rozłożyłem cały projekt na czynniki
AppCompatActivity
, a następnie kliknij prawym przyciskiemLayout Folder
myszy, wybierznew
->Activity
potemNavigation Drawer Activity
i Boom, wszystko jest zrobione za mnie!źródło
Widok może być wszystkim, co nie jest zawyżone. Ten rodzaj błędu pojawia się, gdy występuje konflikt w rozwiązywaniu nazw klas lub atrybutów nazwy widoku, do którego odwołuje się plik XML.
Kiedy pojawia się ten sam błąd, wszystko jest czyste i bezpieczne w pliku UI-XML, widoku, którego używałem,
Używałem atrybutu stylu, który odnosił się do właściwości komponentów materiału. Ale mój styles.xml miał ...
Gdzie klasa rozwiązująca stanęła w obliczu konfliktu. Moje atrybuty widoku odnosiły się do właściwości, która nie została zdefiniowana w motywie aplikacji. Pomógł mi odpowiedni motyw macierzysty z komponentów materiałowych. Więc zmieniłem atrybut rodzica na ...
Który rozwiązał problem.
źródło
Myślę, że podstawowym problemem jest „android: targetSdkVersion” zdefiniowany w AndroidManifest.xml. W moim przypadku wartość początkowa, którą zdefiniowałem jako:
android:targetSdkVersion=16
Zmieniłem to na:
android:targetSdkVersion=22
który rozwiązał mój cały błąd. Dlatego skonfigurowanie poprawnej „targetSdkVersion” jest również ważne przed utworzeniem aplikacji na Androida.
źródło
Jeśli ktoś tu przyjdzie, a odpowiedzi nie pomogą w rozwiązaniu problemu, spróbuj jeszcze jednej rzeczy.
Jak wspominali inni, zwykle jest to spowodowane problemem zagnieżdżonym w samym kodzie XML, a nie czymś, co zrobiłeś źle w swojej Javie. W moim przypadku był to super łatwy (i głupi) błąd do naprawienia.
Miałem taki kod:
Kiedy wszystko, co musiałem zrobić, to użyć dużej litery v w polu „Widok”, aby system je rozpoznał. Sprawdź, czy wszystkie Twoje widoki niestandardowe (lub fragmenty, widoki recyklingu itp.) Mają z góry odpowiednią deklarację pisaną wielką literą, aby autouzupełnianie XML dopasowało je do odpowiedniego widoku.
źródło
Miałem również ten błąd i po bardzo długim debugowaniu problem wyglądał tak, że moja rozszerzona aktywność MainClass zamiast FrameActivity, w moim przypadku XML nie był problemem. Mam nadzieję, że ci pomogę.
źródło
W moim przypadku .
Układ, który próbowałem nadmuchać, miał
tag, usunięcie go naprawiło.
Próbowałem nadmuchać poprzedni układ zaprojektowany dla Actvity w adapterze przeglądania pagera.
źródło
Mój błąd był spowodowany innym problemem.
Przekazywałem pakiet z Działania do jego fragmentu. Kiedy skomentowałem kod odbierający paczkę we fragmencie, błąd zniknął. Jak się okazuje, mój błąd był spowodowany poniższym "getArguments ();" część, która zwracała wartość null.
Po sprawdzeniu kodu wysyłającego aktywność zdałem sobie sprawę, że poniżej popełniłem głupi błąd;
Tworzyłem NOWY fragment w linii ze strzałką. Podczas gdy powinienem był użyć wstępnie utworzonego fragmentu, który już miał mój pakiet. A więc powinno być:
Nie wiem dlaczego dokładnie wyrzuca ten błąd zamiast NPE, ale to rozwiązało mój błąd na wypadek, gdyby ktoś miał ten sam scenariusz
źródło
Miałem ten sam problem, w moim przypadku nazwa pakietu była nieprawidłowa, naprawienie go rozwiązało problem.
źródło
Otwórz gradle.properties i dodaj następujący wiersz:
Źródła: https://github.com/chrisjenx/Calligraphy/issues/417#issuecomment-365177808
źródło
Wystąpił ten błąd, gdy mój RecyclerView był w katalogu głównym mojego fragment.xml,
ale kiedy opakowałem go w ViewGroup, aplikacja działała dobrze.
źródło
Dodaj to pole nazwy w nawigacji
źródło