Ich habe einen sehr frustrierenden Fehler, den ich nicht erklären kann. Ich habe eine Android-Anwendung erstellt, mit Android AppCompat
der sie mit älteren Versionen kompatibel gemacht werden kann. Hier ist meine Hauptaktivitätslayoutdatei:
<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>
Und hier ist der Hauptcode meiner Aktivität:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Das Hauptproblem hierbei ist: Der obige Code läuft auf fast allen Geräten (stimulierten Geräten oder einigen realen Geräten) reibungslos. Aber wenn ich es auf Samsung S3 laufen lasse. Es bemerkt diesen Fehler:
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)
Bitte sag mir, wie ich den Fehler beheben kann, danke :)
Antworten:
Nach langer Zeit zum Debuggen habe ich dieses Problem behoben. (Obwohl ich immer noch nicht erklären kann warum). Dass ich Eigenschaft ändern
android:name
zuclass
. (Obwohl auf Android Document, sagen sie, dass diese Eigenschaften gleich sind, aber es funktioniert !!!)Es sollte sich also ändern von:
zu
Ein neues Layout sollte also sein:
Ich hoffe das hilft :)
quelle
android:id
zuclass
) hat bei mir funktioniert. Ich habe auch eine Lint-Warnung erhalten,Fragment
zufragment
der ich wechseln konnte , was ich auch getan habe.name
zu zu wechselnclass
. Ich habe einige Benutzer diesen Absturz melden lassen, kann ihn aber nicht selbst nachweisen!Ich konnte mein Problem mit den bereitgestellten Antworten nicht lösen. Schließlich habe ich das geändert:
dazu:
,
und es funktioniert.
Wenn Sie es innerhalb eines Fragments verwenden, verwenden Sie getChildFragmentManager anstelle von getSupportFragmentManager .
quelle
TL / DR : Beim Erstellen eines Fragments, auf das aus einem übergeordneten Layout-XML verwiesen wird, ist eine Ausnahme aufgetreten . Diese Ausnahme führte dazu, dass die Inflation des Layouts auf höherer Ebene fehlschlug, die ursprüngliche Ausnahme wurde jedoch nicht gemeldet . In der Stapelverfolgung wird nur der übergeordnete Inflationsfehler angezeigt. Um die Grundursache zu finden, müssen Sie die anfängliche Ausnahme abfangen und protokollieren .
Die ursprüngliche Ursache des Fehlers könnte eine Vielzahl von Dingen sein, weshalb es hier so viele verschiedene Antworten gibt, was das Problem für jede Person behoben hat. Für manche war es mit den zu tun
id
,class
odername
Attribute. Bei anderen lag dies an einem Berechtigungsproblem oder einer Build-Einstellung. Für mich haben diese das Problem nicht behoben; Stattdessen gab es eine zeichnbare Ressource, die nur an einem geeignetendrawable-ldrtl-xhdpi
Ort wie vorhanden wardrawable
.Aber das sind nur Details. Das große Problem ist, dass die Fehlermeldung, die in logcat angezeigt wird, nicht die Ausnahme beschreibt, mit der alles gestartet wurde. Wenn ein übergeordnetes Layout-XML auf ein Fragment verweist, wird das Fragment
onCreateView()
aufgerufen. Wenn eine Ausnahme in einem Fragment auftrittonCreateView()
(z. B. beim Aufblasen des Layout-XML des Fragments), schlägt das Aufblasen des übergeordneten Layout-XML fehl. Dieser übergeordnete Inflationsfehler wird in den Fehlerprotokollen als Ausnahme gemeldet. Die anfängliche Ausnahme scheint jedoch nicht gut genug in der Kette zu sein, um gemeldet zu werden.In dieser Situation stellt sich die Frage, wie die anfängliche Ausnahme verfügbar gemacht werden kann, wenn sie nicht im Fehlerprotokoll angezeigt wird.
Die Lösung ist ziemlich einfach: Setzen Sie einen
try
/catch
-Block um den Inhalt des FragmentsonCreateView()
undcatch
protokollieren Sie in der Klausel die Ausnahme:Es ist möglicherweise nicht offensichtlich, für welche Fragmentklasse
onCreateView()
dies getan werden soll. In diesem Fall für jede Fragmentklasse, die in dem Layout verwendet wird, das das Problem verursacht hat. Im Fall des OP war beispielsweise der Code der App, in dem die Ausnahme aufgetreten istwelches ist
Sie müssen also Ausnahmen in den
onCreateView()
Fragmenten abfangen, auf die im Layout verwiesen wirdactivity_main
.In meinem Fall stellte sich heraus, dass die Grundursache eine Ausnahme war
Diese Ausnahme wurde erst im Fehlerprotokoll angezeigt, als ich sie abgefangen
onCreateView()
und explizit protokolliert habe. Nach der Protokollierung war das Problem leicht zu diagnostizieren und zu beheben ( aus irgendeinem Grunddetails_view.xml
nur unter demldrtl-xhdpi
Ordner vorhanden). Der Schlüssel war, die Ausnahme zu erkennen, die die Wurzel des Problems war, und sie aufzudecken.Es tut nicht weh, dies in all den
onCreateView()
Methoden Ihrer Fragmente als Boilerplate zu tun . Wenn es dort eine nicht erfasste Ausnahme gibt, stürzt die Aktivität trotzdem ab. Der einzige Unterschied besteht darin, dass Sie, wenn Sie die Ausnahme abfangen und anmeldenonCreateView()
, nicht im Dunkeln darüber sind, warum sie passiert ist.PS Ich habe gerade festgestellt, dass diese Antwort mit @ DaveHubbard zusammenhängt, verwendet jedoch einen anderen Ansatz, um die Grundursache zu finden (Protokollierung vs. Debugger).
quelle
Ich hatte das gleiche Problem, Problem, versuchte alle Antworten in diesem Thread ohne Erfolg. Meine Lösung war, dass ich der Aktivitäts-XML keine ID hinzugefügt hatte. Ich dachte nicht, dass es wichtig sein würde, aber es tat es.
In der Aktivitäts-XML hatte ich also:
Aber hätte haben sollen:
Wenn jemand gerne kommentieren würde, warum dies so ist, bin ich ganz Ohr für andere, ich hoffe, das hilft.
quelle
Es wird möglicherweise nicht mehr für Sie benötigt, aber wenn weitere Leser es hilfreich finden. Ich habe genau das gleiche
android.view.InflateException:...Error inflating class fragment
. Ich hatte alle richtigen Bibliotheken enthalten. Gelöst durch Hinzufügen einer weiteren Benutzerberechtigung in derAndroidManifest.xml
Datei, dh<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Übrigens rannte ich
Android Studio 0.8.9 on Ubuntu 12.04.
quelle
Ich habe das gleiche Problem, weil ich den Listener nicht implementiert habe. Siehe den folgenden Code mit
/*Add This!*/
.Zu Ihrer Information, meine Fragmentklasse ist ungefähr so:
Bearbeiten:
Ich bemerke dieselbe Fehlermeldung auch unter anderen Umständen, wenn es eine Ausnahme in der
onCreate
Funktion des gibtFragment
. Ich habe etwas wie das Folgende:Da ich dieses Fragment wieder verwende, vergesse ich völlig, Argumente zu setzen. Dann das Ergebnis
getArguments()
istnull
. Offensichtlich bekomme ich hier einenull
Zeigerausnahme. Ich werde vorschlagen, dass Sie auch solche Fehler im Auge behalten.quelle
Erweitert Ihr NavigationDrawerFragment das android.support.v4.app.Fragment? Mit anderen Worten, importieren Sie das richtige Paket?
quelle
Ich hatte auch dieses Problem. Ich habe es gelöst, indem ich den Import in
MainActivity
und ersetzt habeNavigationDrawerFragment
Von
Zu
Ich habe aktualisiert,
MainActivity
umActionBarActivity
anstelle von Aktivität zu erweiternVerwenden Sie
ActionBar actionBar = getSupportActionBar();
diese Option auch , um die ActionBar abzurufenUnd ich habe die folgende Funktion in aktualisiert
NavigationDrawerFragment
quelle
Ich habe mich diesem Problem gestellt und es mit den folgenden Codes gelöst. Ich begann die Fragmenttransaktion mit dem Childfragment Manager.
Layout:
So begann ich mit der Fragmenttransaktion:
Der folgende Code erklärt, wie ich das Fragment entfernt habe, das mit childfragmentmanger hinzugefügt wurde.
quelle
Ich hatte ähnliche Probleme beim Ein- und Ausschalten. Die Fehlermeldung enthält häufig nur sehr wenige Details, unabhängig von der tatsächlichen Ursache. Aber ich habe einen Weg gefunden, um weitere nützliche Informationen zu erhalten. Es stellt sich heraus, dass die interne Android-Klasse 'LayoutInflater.java' (im android.view-Paket) eine 'inflate'-Methode hat, die eine Ausnahme erneut auslöst, aber die Details nicht erfasst, sodass Sie Informationen über die Ursache verlieren.
Ich habe AndroidStudio verwendet und einen Haltepunkt in der LayoutInflator-Zeile 539 (in der Version, in der ich arbeite) festgelegt. Dies ist die erste Zeile des catch-Blocks für eine generische Ausnahme in dieser 'inflate'-Methode:
Wenn Sie im Debugger auf 'e' schauen, sehen Sie ein 'Ursache'-Feld. Es kann sehr hilfreich sein, Ihnen einen Hinweis darauf zu geben, was wirklich passiert ist. So habe ich beispielsweise festgestellt, dass das übergeordnete Element eines enthaltenen Fragments eine ID haben muss, auch wenn es nicht in Ihrem Code verwendet wird. Oder dass eine Textansicht ein Problem mit einer Dimension hatte.
quelle
Nur für den Fall, dass jemand dies braucht. Annahmen: Gerätetelefon an USB-Kabel angeschlossen und Ihre IDE-Anzeige, um die App zu starten. Gehen Sie zur Eingabeaufforderung, um das Problem zu ermitteln: Geben Sie adb logcat ein
Starten Sie dann Ihre App über die IDE. Sie werden eine Ausnahme machen.
In meinem Fall: Ich habe eine Android-App der Version 2.3 auf einem mobilen Gerät bereitgestellt, das das Widget "Space" nicht unterstützt.
quelle
Dieses Problem tritt auf, wenn Sie eine benutzerdefinierte Klasse haben, die eine andere Klasse (in diesem Fall eine Ansicht) erweitert und nicht alle für die Klasse erforderlichen Konstruktoren importiert.
Zum Beispiel: public class CustomTextView erweitert TextView {}
Diese Klasse hätte 4 Konstruktoren und wenn Sie einen verpassen, würde sie abstürzen. Tatsächlich habe ich den letzten verpasst, der von Lollipop verwendet wurde, fügte diesen Konstruktor hinzu und funktionierte gut.
quelle
Wir müssen auch Folgendes in build.gradle (App) hinzufügen.
wann immer wir neue Layouts oder neue Designmerkmale verwenden. hoffe das hilft dir
quelle
Wie in einem vorherigen Beitrag erwähnt,
umbenennen
zu
Trotzdem hat es bei mir nicht funktioniert. Ich habe dann einfach den Klassennamen ohne den com.fragment-Teil verwendet und voila, es hat funktioniert. Also ändere es endlich auf
quelle
Nachdem mir keine der Antworten hier geholfen hat, habe ich mich dafür entschieden, die App im Debug-Modus auszuführen und mich über jede Zeile von onCreateView in meinem Fragment zu bewegen (in Ihrem Fall NavigationDrawerFragment). Und bemerkte, dass das Fragment aufgrund einer NullPointerException Schwierigkeiten beim Aufblasen hatte. Z.B
Hier wurde mySeekBar auf null gesetzt (weil ich das Hinzufügen des Steuerelements in einem geeigneten Layout verpasst hatte) und die nächste Zeile kam in NPE, das als InflateException herauskam. Benennen Sie außerdem, wie oben vorgeschlagen, android: name in class um.
Dieses Problem kann aus verschiedenen oben genannten Gründen auftreten. Ich würde einen zeilenweisen Debug-Ablauf empfehlen, um zu wissen, was falsch ist.
quelle
onCreateView()
Methode eines Fragments auf ?Für einige von Ihnen, die noch keine Lösung dafür gefunden haben, geschah dies in meinem Fall, weil ich ein OOM-Problem (Out of Memory) hatte. Dies kann passieren, wenn Sie beispielsweise bei längerer Verwendung einen Speicherverlust in Ihrer App haben. In meiner Stapelverfolgung war dies der Hauptgrund.
quelle
Ich weiß nicht, ob das helfen wird.
Ich hatte dieses Problem mit einer TextView in dem Layout, das ich aufblasen wollte ( android.view.InflateException: Binäre XML-Dateizeile Nr. 45: Fehler beim Aufblasen der Klasse TextView ).
Ich hatte das folgende XML-Attribut android gesetzt: textSize = "? Android: attr / textAppearanceLarge" , wodurch das Layout nicht aufgeblasen werden konnte.
Ich weiß nicht genau, warum ( ich bin noch ein bisschen neu in Android - weniger als ein Jahr Erfahrung ) etwas mit dem Aufrufen von Systemattributen zu tun haben könnte, idk, alles was ich weiß ist, sobald ich einfaches altes @ verwendet habe dimen / md_text_16sp ( was ein Brauch von mir ist ), Problem gelöst :)
Hoffe das hilft...
quelle
Widget.Design.TextInputLayout
: erbt . stackoverflow.com/questions/19874882/…Ich hatte dies auf einem 4.4.2-Gerät, aber 5+ war in Ordnung. Die Ursache: Bei der Initialisierung einer benutzerdefinierten Ansicht habe ich eine
TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)
API 21+ erstellt.Android Studio 2.1 beschwert sich nicht darüber, obwohl es mit Anmerkungen versehen ist
TargetApi(21)
. Anscheinend wird Android Studio 2.2 dies korrigieren und es korrekt als Fehler anzeigen.Hoffe das hilft jemandem.
quelle
Ich bin etwas spät zur Party, aber keine dieser Antworten hat mir in meinem Fall geholfen. Ich habe Google Map als SupportMapFragment und PlaceAutocompleteFragment in meinem Fragment verwendet. Wie alle Antworten darauf hinwiesen, dass das Problem darin besteht, dass SupportMapFragment die Karte ist, die neu erstellt und neu gezeichnet werden soll.
Ich hatte aber auch ein Problem mit PlaceAutocompleteFragment. Hier ist die funktionierende Lösung für diejenigen, die aufgrund von SupportMapFragment und SupportMapFragment mit diesem Problem konfrontiert sind
Und in onDestroyView löschen Sie SupportMapFragment und SupportMapFragment
quelle
Nach langen Versuchen habe ich das Problem auf diese Weise gelöst, nachdem keine der oben genannten Antworten dies konnte.
AppCompatActivity
für IhreMain
Aktivität stattActivity
.android:theme="@style/Theme.AppCompat.Light"
Ihrem<Activity..../>
in der hinzuAndroidManifest.xml
NavigationDrawerFragment
Ändern Sie in Ihrer Klasse IhreActionBar
Instanzen inBEARBEITEN
Es sollte eine Konsistenz zwischen Aktivität und Layout bestehen . Wenn der Aufbau eines der hat AppCompat Themen so wie
Theme.AppCompat.Light
, Ihre Aktivität sollteextends AppCompatActivity
.Ich wollte das Burger- Symbol und eine Navigationsleiste haben, die der Android Gmail App ähnelt , aber am Ende hatte ich eine hässliche Navigationsleiste . All das, weil alle meine Klassen
extends Activity
stattAppCompatActivity
.Ich habe das gesamte Projekt überarbeitet
AppCompatActivity
, um es zu erweitern , dann mit der rechten Maustaste auf dasLayout Folder
geklickt,new
->Activity
dannNavigation Drawer Activity
und Boom gewählt, alles ist für mich erledigt!quelle
Die Ansicht kann alles sein, was nicht aufgeblasen werden kann. Diese Art von Fehler tritt auf, wenn beim Auflösen der Klassennamen oder des Namensattributs einer Ansicht, auf die in der XML-Datei verwiesen wird, ein Konflikt auftritt.
Wenn ich den gleichen Fehler erhalte, habe ich gerade alles sauber und sicher in der UI-XML-Datei, der Ansicht, die ich verwendet habe,
Ich habe ein Stilattribut verwendet, das auf die Eigenschaft Materialkomponenten verweist. Aber meine styles.xml hatte ...
Wo die Klassenauflösung dem Konflikt gegenüberstand. Meine Ansichtsattribute verwiesen auf eine Eigenschaft, die in meinem App-Design nicht definiert wurde. Das richtige übergeordnete Thema aus Materialkomponenten hat mir geholfen. Also habe ich das übergeordnete Attribut in ... geändert.
Welches löste das Problem.
quelle
Ich denke, das Grundproblem ist "android: targetSdkVersion", das in AndroidManifest.xml definiert ist. In meinem Fall der Anfangswert, den ich definiert habe als:
android:targetSdkVersion=16
Ich habe es geändert in:
android:targetSdkVersion=22
Das hat meinen ganzen Fehler behoben. Daher ist es auch wichtig, die richtige "targetSdkVersion" einzurichten, bevor Sie eine Android-App erstellen.
quelle
Falls jemand anderes hierher kommt und die Antworten nicht zur Lösung des Problems beitragen, versuchen Sie es noch einmal.
Wie andere bereits erwähnt haben, wird dies normalerweise durch ein Problem verursacht, das im XML selbst verschachtelt ist, im Gegensatz zu etwas, das Sie in Ihrem Java falsch gemacht haben. In meinem Fall war es ein super einfacher (und dummer) Fehler zu beheben.
Ich hatte folgenden Code:
Als alles, was ich tun musste, war das v in 'Ansicht' groß zu schreiben, damit das System es erkannte. Überprüfen Sie, ob Ihre benutzerdefinierten Ansichten (oder Fragmente, Recycling-Ansichten usw.) im Voraus die richtige großgeschriebene Deklaration haben, damit die automatische XML-Vervollständigung sie mit der entsprechenden Ansicht übereinstimmt.
quelle
Ich hatte auch diesen Fehler und nach sehr langem Debuggen stellte sich heraus, dass meine MainClass-Aktivität anstelle von FrameActivity erweitert wurde. In meinem Fall war die XML kein Problem. Ich hoffe, Ihnen zu helfen.
quelle
In meinem Fall .
Das Layout, das ich aufblasen wollte, hatte
Tag, Entfernen es behoben.
Ich habe versucht, ein vorheriges Layout, das für eine Actvity entwickelt wurde, in den View-Pager-Adapter aufzublasen.
quelle
Mein Fehler wurde durch ein anderes Problem verursacht.
Ich habe ein Bündel von einer Aktivität an ihr Fragment übergeben. Als ich den Code kommentierte, der das Bundle im Fragment erhielt, war der Fehler verschwunden. Wie sich herausstellte, war mein Fehler auf das folgende "getArguments ()" zurückzuführen. Teil, der null zurückgab.
Als ich den Aktivitäts-Sendecode überprüfte, stellte ich fest, dass ich unten einen dummen Fehler hatte.
Ich habe ein NEUES Fragment in der Zeile mit dem Pfeil erstellt. Während ich das vorinstanziierte Fragment hätte verwenden sollen, das bereits mein Bündel hatte. So hätte es sein sollen:
Ich weiß nicht, warum genau dieser Fehler anstelle einer NPE ausgelöst wird, aber dies hat meinen Fehler behoben, falls jemand das gleiche Szenario hat
quelle
Ich hatte das gleiche Problem. In meinem Fall war der Paketname falsch. Durch die Behebung des Problems wurde das Problem behoben.
quelle
Öffnen Sie die Datei gradle.properties und fügen Sie die folgende Zeile hinzu:
Referenz: https://github.com/chrisjenx/Calligraphy/issues/417#issuecomment-365177808
quelle
Ich hatte diesen Fehler, als ich meine RecyclerView im Stammverzeichnis meiner fragment.xml hatte.
Aber als ich es mit einer ViewGroup verpackte, funktionierte die App einwandfrei.
quelle
Fügen Sie dieses Namensfeld in die Navigation ein
quelle