android.view.InflateException: Binäre XML-Datei: Fehler beim Aufblasen des Klassenfragments

151

Ich habe einen sehr frustrierenden Fehler, den ich nicht erklären kann. Ich habe eine Android-Anwendung erstellt, mit Android AppCompatder 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 :)

hqt
quelle
1
In dieser Zeile erhalten Sie eine Ausnahmeprüfung, ob der Klassenname und der Paketname korrekt sind oder nicht. Android: name = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
kalyan pvs
1
Ich habe überprüft und diese Klasse ist wahr. Ich kann auf einigen Geräten kompilieren und ausführen, aber nicht Samsung S3. Ich denke, einige seltsame Probleme hier: (
9.
Sie haben Recht, wenn es auf einem Gerät ausgeführt wird und nicht auf S3. Es ist ein seltsames Problem.
Mein
Ich habe das Problem hier bereits gelöst: stackoverflow.com/a/33128448/4366715 .
Daniel Kilinskas
1
Für diejenigen, die versuchen, die Ursache dieses Fehlers zu diagnostizieren: Die anekdotischen Korrekturen hier sind ein roter Hering. Während des Aufblasens des Fragments tritt eine vorherige Ausnahme auf, die nicht in der Stapelverfolgung angezeigt wird . Es könnte alles sein. Um das Problem zu beheben, müssen Sie herausfinden, was die vorherige Ausnahme ist. Siehe dazu meine Antwort oder die von @ DaveHubbard.
LarsH

Antworten:

126

Nach langer Zeit zum Debuggen habe ich dieses Problem behoben. (Obwohl ich immer noch nicht erklären kann warum). Dass ich Eigenschaft ändern android:namezuclass . (Obwohl auf Android Document, sagen sie, dass diese Eigenschaften gleich sind, aber es funktioniert !!!)

Es sollte sich also ändern von:

 android:name="com.fragment.NavigationDrawerFragment"

zu

class = "com.fragment.NavigationDrawerFragment"

Ein neues Layout sollte also sein:

<!-- 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"
    class = "com.fragment.NavigationDrawerFragment" />

Ich hoffe das hilft :)

hqt
quelle
4
Ich bin auf dieses Problem gestoßen, als ich versucht habe, dem offiziellen Android-Tutorial zu folgen. Ihr Fix (Wechsel android:idzu class) hat bei mir funktioniert. Ich habe auch eine Lint-Warnung erhalten, Fragmentzu fragmentder ich wechseln konnte , was ich auch getan habe.
Stevepastelan
9
@DownVoter: Dieser Fehler ist verwirrend. Und ich finde zum Glück den Weg zu reparieren. Es tut mir wirklich leid, wenn mein Beitrag Ihren Fehler nicht beheben kann, da ich auch nicht erklären kann, warum. Aber ich denke, es sollte keine Abwertung erhalten. :)
hqt
2
Ich frage mich, ob Sie diesen Absturz zuverlässig erhalten haben, ohne von namezu zu wechseln class. Ich habe einige Benutzer diesen Absturz melden lassen, kann ihn aber nicht selbst nachweisen!
Daniel Wilson
8
Funktioniert bei mir nicht Ich bin so müde. 2h von dev und kann nicht finden, warum es nicht funktioniert (Binäre XML-Dateizeile ... Fehler beim Aufblasen des Klassenfragments). Irgendeine Idee ?
Cocorico
31

Ich konnte mein Problem mit den bereitgestellten Antworten nicht lösen. Schließlich habe ich das geändert:

<fragment
android:id="@+id/fragment_food_image_gallery"
android:name="ir.smartrestaurant.ui.fragment.ImageGalleryFragment"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout="@layout/fragment_image_gallery"
tools:layout="@layout/fragment_image_gallery" />

dazu:

<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="200dp" />

,

private void showGallery() {
    ImageGalleryFragment fragment = new ImageGalleryFragment()
    getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .commit();
    }

und es funktioniert.
Wenn Sie es innerhalb eines Fragments verwenden, verwenden Sie getChildFragmentManager anstelle von getSupportFragmentManager .

ReZa
quelle
31

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, classoder nameAttribute. 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 geeigneten drawable-ldrtl-xhdpiOrt wie vorhanden war drawable.

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 Fragments onCreateView()und catchprotokollieren Sie in der Klausel die Ausnahme:

public View onCreateView(LayoutInflater inflater, ViewGroup contnr, Bundle savedInstSt) {
    try {
        mContentView = inflater.inflate(R.layout.device_detail_frag, null);
        // ... rest of body of onCreateView() ...
    } catch (Exception e) {
        Log.e(TAG, "onCreateView", e);
        throw e;
    }
}

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 ist

at android.app.Activity.setContentView(Activity.java:1901)

welches ist

   setContentView(R.layout.activity_main);

Sie müssen also Ausnahmen in den onCreateView()Fragmenten abfangen, auf die im Layout verwiesen wird activity_main.

In meinem Fall stellte sich heraus, dass die Grundursache eine Ausnahme war

Caused by: android.content.res.Resources$NotFoundException: Resource
   "com.example.myapp:drawable/details_view" (7f02006f)  is not a
   Drawable (color or path): TypedValue{t=0x1/d=0x7f02006f a=-1
   r=0x7f02006f}

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 Grund details_view.xmlnur unter dem ldrtl-xhdpiOrdner 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 anmelden onCreateView(), 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).

LarsH
quelle
2
Sie haben mir wahrscheinlich Stunden beim Debuggen erspart. Ein großes Lob!
Szymon Sadło
16

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:

<fragment
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Aber hätte haben sollen:

<fragment
    android:id="@+id/some_fragment"
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Wenn jemand gerne kommentieren würde, warum dies so ist, bin ich ganz Ohr für andere, ich hoffe, das hilft.

Gurren
quelle
1
Danke, das hat bei mir funktioniert. Ich hatte monatelang eine ID weggelassen, aber nach einigen Layoutänderungen bekam ich plötzlich diesen Absturz. Android ist komisch.
erisco
Sie antworten funktioniert für mich. Ich frage mich nur, warum ich das ID-Attribut einfügen soll, wenn ich es nirgendwo verwende. Kannst du mir erklären?
Moshii
12

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 der AndroidManifest.xmlDatei, dh<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Übrigens rannte ich Android Studio 0.8.9 on Ubuntu 12.04.

Abu Shumon
quelle
Hat für mich gearbeitet! Vielen Dank!
Dadan
12

Ich habe das gleiche Problem, weil ich den Listener nicht implementiert habe. Siehe den folgenden Code mit /*Add This!*/.

public class SomeActivity extends AppCompatActivity
        implements BlankFragment.OnFragmentInteractionListener /*Add this!*/ 
{
    @Override                                                  /*Add This!*/
    public void onFragmentInteraction(Uri uri){                /*Add This!*/
    }                                                          /*Add This!*/
}

Zu Ihrer Information, meine Fragmentklasse ist ungefähr so:

public class SomeFragment extends Fragment {

    private OnFragmentInteractionListener mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(Uri uri);
    }
}

Bearbeiten:

Ich bemerke dieselbe Fehlermeldung auch unter anderen Umständen, wenn es eine Ausnahme in der onCreateFunktion des gibt Fragment. Ich habe etwas wie das Folgende:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

    int ID = getArguments().getInt("val");

    return rootView;
} 

Da ich dieses Fragment wieder verwende, vergesse ich völlig, Argumente zu setzen. Dann das Ergebnis getArguments()ist null. Offensichtlich bekomme ich hier eine nullZeigerausnahme. Ich werde vorschlagen, dass Sie auch solche Fehler im Auge behalten.

Yuchen Zhong
quelle
1
Vielen Dank! Das hat sehr geholfen!
DLee
8

Erweitert Ihr NavigationDrawerFragment das android.support.v4.app.Fragment? Mit anderen Worten, importieren Sie das richtige Paket?

import android.support.v4.app.Fragment;
Wang
quelle
6

Ich hatte auch dieses Problem. Ich habe es gelöst, indem ich den Import in MainActivityund ersetzt habeNavigationDrawerFragment

Von

import android.app.Activity;
import android.app.ActionBar;

Zu

import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;

Ich habe aktualisiert, MainActivityum ActionBarActivityanstelle von Aktivität zu erweitern

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks

Verwenden Sie ActionBar actionBar = getSupportActionBar();diese Option auch , um die ActionBar abzurufen

Und ich habe die folgende Funktion in aktualisiert NavigationDrawerFragment

private ActionBar getActionBar()
{
    return ((ActionBarActivity)getActivity()).getSupportActionBar();
}
Fr4nz
quelle
Ich denke das ist die richtige Antwort. Aber ich habe AppCompatActivity anstelle von ActionBarActivity (nicht veraltet) verwendet und auch den Import android.app.ActionBar nicht entfernt (wie es die onAttach-Methode verwendet)
GramThanos
6

Ich habe mich diesem Problem gestellt und es mit den folgenden Codes gelöst. Ich begann die Fragmenttransaktion mit dem Childfragment Manager.

Layout:

                  <fragment
                    class="com.google.android.youtube.player.YouTubePlayerSupportFragment"
                    android:id="@+id/youtube_fragment"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>

So begann ich mit der Fragmenttransaktion:

   youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);

Der folgende Code erklärt, wie ich das Fragment entfernt habe, das mit childfragmentmanger hinzugefügt wurde.

@Override
    public void onDestroyView() {
        super.onDestroyView();

        youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);

        if (youTubePlayerFragment != null)
        {
            getChildFragmentManager().beginTransaction().remove(youTubePlayerFragment).commitAllowingStateLoss();
        }

        youTubePlayer = null;
    }
Ali Gürelli
quelle
TY Ali. Du hast meinen Tag gerettet!
VM345
Funktioniert gut. Danke dir!
Polyariz
4

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:

        } catch (Exception e) {
            InflateException ex = new InflateException(
                    parser.getPositionDescription()
                            + ": " + e.getMessage());
            ex.initCause(e);
            throw ex;

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.

Dave Hubbard
quelle
3

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.

al881
quelle
3

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.

Sagar Devanga
quelle
2

Wir müssen auch Folgendes in build.gradle (App) hinzufügen.

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'

wann immer wir neue Layouts oder neue Designmerkmale verwenden. hoffe das hilft dir

Uma Achanta
quelle
2

Wie in einem vorherigen Beitrag erwähnt,
umbenennen

android:name="com.fragment.NavigationDrawerFragment"

zu

class = "com.fragment.NavigationDrawerFragment"

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

class = "NavigationDrawerFragment"
nach Westen schweben
quelle
2

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

mySeekBar = (SeekBar) getActivity().findViewById(R.id.mySeekBar);
mySeekBar.setOnSeekBarChangeListener(this);

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.

Vishy
quelle
Und trat dieser Fehler bei der onCreateView()Methode eines Fragments auf ?
LarsH
1

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.

Sam Bellerose
quelle
1

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...

tl_
quelle
Ich hatte weder Fragmente noch textSize Android-Attribut. Mein Fehler bezog sich auf ein TextInputLayout mit einem benutzerdefinierten Stil, der TextAppearance.AppCompat anstelle von Widget.Design.TextInputLayout: erbt . stackoverflow.com/questions/19874882/…
Junior Mayhé
1

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.

Tom
quelle
1

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

 mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
    FragmentManager fm = getChildFragmentManager();

    if (mapFragment == null) {
        mapFragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.mapFragment, mapFragment).commit();
        fm.executePendingTransactions();
    }

    mapFragment.getMapAsync(this);

    //Global PlaceAutocompleteFragment autocompleteFragment;


    if (autocompleteFragment == null) {
        autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autoCompleteFragment);

    }

Und in onDestroyView löschen Sie SupportMapFragment und SupportMapFragment

@Override
public void onDestroyView() {
    super.onDestroyView();


    if (getActivity() != null) {
        Log.e("res","place dlted");
        android.app.FragmentManager fragmentManager = getActivity().getFragmentManager();
        android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(autocompleteFragment);
        fragmentTransaction.commit();

        autocompleteFragment = null;
    }


}
Ratul Bin Tazul
quelle
1

Nach langen Versuchen habe ich das Problem auf diese Weise gelöst, nachdem keine der oben genannten Antworten dies konnte.

  1. Erweitern Sie AppCompatActivityfür Ihre MainAktivität statt Activity.
  2. Fügen Sie android:theme="@style/Theme.AppCompat.Light"Ihrem <Activity..../>in der hinzuAndroidManifest.xml
  3. NavigationDrawerFragmentÄndern Sie in Ihrer Klasse Ihre ActionBarInstanzen in

    ActionBar mActionBar=((AppCompatActivity)getActivity()).getSupportActionBar();

BEARBEITEN

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 sollte extends 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 Activitystatt AppCompatActivity.

Ich habe das gesamte Projekt überarbeitet AppCompatActivity, um es zu erweitern , dann mit der rechten Maustaste auf das Layout Foldergeklickt, new-> Activitydann Navigation Drawer Activityund Boom gewählt, alles ist für mich erledigt!

Yahya
quelle
1
android.view.InflateException: Binary XML file line #16: Error inflating class com.google.android.material.bottomappbar.BottomAppBar

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,

   <com.google.android.material.bottomappbar.BottomAppBar
    android:id="@+id/bottomAppBar"
    style="@style/Widget.MaterialComponents.BottomAppBar.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:hideOnScroll="true"
    app:menu="@menu/bottom_app_bar"
    app:navigationIcon="@drawable/ic__menu_24"/>

Ich habe ein Stilattribut verwendet, das auf die Eigenschaft Materialkomponenten verweist. Aber meine styles.xml hatte ...

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
....
</style>

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.

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
...
</style>

Welches löste das Problem.

Shrinivas Manjithaya
quelle
0

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.

Sanjeev
quelle
0

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:

<view
    android:layout_width="fill_parent"
    android:layout_height="1dip"
    android:id="@+id/view44"
    android:background="@color/gray"
    />

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.

PGMacDesign
quelle
0

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.

Copacel
quelle
0

In meinem Fall .

Das Layout, das ich aufblasen wollte, hatte

<include 
 layout  = "...."
/>

Tag, Entfernen es behoben.

Ich habe versucht, ein vorheriges Layout, das für eine Actvity entwickelt wurde, in den View-Pager-Adapter aufzublasen.

mughil
quelle
0

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.

Bundle args = getArguments();

Als ich den Aktivitäts-Sendecode überprüfte, stellte ich fest, dass ich unten einen dummen Fehler hatte.

Bundle bundle =new Bundle();
 bundle.putInt("recipeID", recipe_position);
 Fragment mainFragment = new MainActivityFragment();
 mainFragment.setArguments(bundle);
 FragmentManager fragmentManager = getSupportFragmentManager();
 --> fragmentManager.beginTransaction()
                        .replace(R.id.container, new  MainActivityFragment(),
                                DetailRecipeActivityFragment.TAG)
                        .commit();

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:

Bundle bundle =new Bundle();
 bundle.putInt("recipeID", recipe_position);
 Fragment mainFragment = new MainActivityFragment();
 mainFragment.setArguments(bundle);
 Fragment mainFragment = new MainActivityFragment();
 FragmentManager fragmentManager = getSupportFragmentManager();
 -->fragmentManager.beginTransaction()
                        .replace(R.id.container, mainFragment,
                                DetailRecipeActivityFragment.TAG)
                        .commit();

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

Amgad
quelle
0

Ich hatte das gleiche Problem. In meinem Fall war der Paketname falsch. Durch die Behebung des Problems wurde das Problem behoben.

Tincho825
quelle
0

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.

7odafarghal
quelle
0

Fügen Sie dieses Namensfeld in die Navigation ein

android: name = "androidx.navigation.fragment.NavHostFragment"

   <fragment
             android:id="@+id/container"
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:name="androidx.navigation.fragment.NavHostFragment"
             app:navGraph="@navigation/navigation"
             app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
             app:layout_constraintTop_toTopOf="parent">
Jai Khambhayta
quelle