Errore durante il gonfiaggio del frammento di classe


161

Ottengo l'errore

Unable to start activity ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}: android.view.InflateException: Binary XML file line #11: Error inflating class fragment

quando passo attraverso la modalità verticale e orizzontale. Sto usando i frammenti. Il mio xml è:

 <LinearLayout android:id="@+id/mainLayout"
               android:orientation="horizontal"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content" >

    <ListView android:id="@+id/android:list"
              android:layout_height="wrap_content"
              android:layout_width="fill_parent"/> 

    <fragment android:id="@+id/fragmentDetails"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent"
              class="de.androidbuch.activiti.task.TaskDetailsFragment"/> 
</LinearLayout>

Se passo dalla modalità orizzontale a quella verticale, tutto funziona bene. Ma quando faccio clic sul mio frammento (e posso vedere il mio frammento) e poi passare all'altra modalità, ottengo l'errore. Qualche idea su come posso risolverlo? Ho trovato alcune risposte qui, ma nessuna di queste mi ha aiutato ...

06-21 14:55:05.600: ERROR/AndroidRuntime(7636): FATAL EXCEPTION: main
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): java.lang.RuntimeException: Unable to start activity         
ComponentInfo{de.androidbuch.activiti/de.androidbuch.activiti.task.Activity}:   android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1736)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3097)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.access$1600(ActivityThread.java:123)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:997)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.os.Looper.loop(Looper.java:126)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.main(ActivityThread.java:3998)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at java.lang.reflect.Method.invokeNative(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at java.lang.reflect.Method.invoke(Method.java:491)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at dalvik.system.NativeStart.main(Native Method)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636): Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:727)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:227)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.Activity.setContentView(Activity.java:1771)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at de.androidbuch.activiti.task.TaskActivity.onCreate(TaskActivity.java:83)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1700)
06-21 14:55:05.600: ERROR/AndroidRuntime(7636):     ... 12 more

Stai mantenendo file di layout separati nelle cartelle layout e land-layout?
Nathan Fig,

Puoi fornire il registro degli errori completo, comprese le righe dopo "Impossibile avviare l'attività ..."
Dave,

@Nathan Fig: sì, sì .. ma ricevo gli errori ..
tsync,

@Dave: ecco qua .. qualche idea?
tsync,

Hai bisogno di un codice di layout orizzontale, e anche utili sarebbero le tue chiamate a setContentView e anche come stai attivando l'attività in modalità verticale come suppongo che tu sia. Al momento non sembrano esserci abbastanza informazioni. Guardare l'esempio di FragmentLayout nelle demo dell'API può aiutarti in quanto sembra che tu stia facendo qualcosa di simile.
PJL,

Risposte:


131

Come ha detto hdemirchian, assicurati di usare:

import android.support.v4.app.Fragment;

Inoltre, assicurati che l'attività che utilizza i frammenti si estenda al FragmentActivityposto del normale Activity,

import android.support.v4.app.FragmentActivity;

per ottenere la FragmentActivityclasse.


12
Questo è stato votato molto, ma per me si arresta in modo anomalo quando riprendo l'app, e sto già usando v4 Fragment e v4 FrsgmentActivity - per essere più precisi AppCompatActivity.
joseph,

4
Questa non è una soluzione. import android.support.v4.app.Fragment; non cambia nulla. In realtà è anche importazione inutilizzata e non necessaria.
f470071

7
Grazie, una nota a margine è che AppCompatActivity è un discendente di FragmentActivity.
abedfar

ma sto usando il frammento di pugnale e il frammento di pugnale estende sempre l'attività del frammento e non del frammento
user3475052

96

L'eccezione android.view.InflateException: Binary XML file line: #... Error inflating class fragmentpotrebbe verificarsi se si manipola getActivity()all'interno del frammento prima di onActivityCreated()essere chiamato. In tal caso, ricevi un riferimento di attività errato e non puoi fare affidamento su di esso.

Ad esempio il modello successivo è sbagliato:

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

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...); - another problem: button is null

    return view;
}

Motivo corretto n. 1

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

    Button button = view.findViewById(R.id...);
    button.setOnClickListener(...);

    return view;
}

Motivo corretto n. 2

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Button button = getActivity().findViewById(R.id...);
    button.setOnClickListener(...);
}

@MaximKorobov Puoi chiamare getActivity()all'interno onActivityCreated()o in qualsiasi metodo successivo del ciclo di vita, ma prima onDestroyView().
Grigori A.

Grazie mille, questo ha aiutato immensamente!
Fucile Ninja,

Grazie :-) Questo mi ha fatto risparmiare un sacco di tempo :)
user1007522

Mi piacerebbe saperne di più su questo, sto ricevendo uno schianto sporadico e penso che questo potrebbe essere il problema. Anche se la maggior parte delle volte il codice funziona bene, quindi è difficile da sapere
Daniel Wilson,

Il modello 2 potrebbe averlo risolto per me. Dita incrociate. Grazie per quello
joseph,


36

Ho avuto lo stesso errore. Stavo scavando tutto il giorno, non so, ma penso di aver provato ~ 25 soluzioni a questo problema. Nessuno ha funzionato fino a quando alle 2 del mattino ho scoperto che mi mancava questa linea in app manifest xml:

<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

Quella riga era all'interno del <application>tag. Spero davvero che questo aiuti per qualcuno. GL.


3
Mio eroe. Le persone come te sono così fantastiche!
capdragon,

5
Spiega cosa sta succedendo per favore. Qual è il vantaggio di questa linea?
Mansour Fahad,

2
Grazie, salva la mia giornata. Ogni esempio di utilizzo di Google map su Android funziona in modo diverso, mi chiedo se esiste uno standard.
user2812866

22

Ho avuto lo stesso problema. La soluzione per me era l'ordine di super.onCreate e setContentView all'interno di FragmentActivity

Il seguente ordine funziona bene:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.fc_activity_list_profiles);

3
Perché questo lo risolve?
Spencer

1
In un metodo JAVA, superdeve essere sempre chiamato all'inizio del metodo.
Stéphane Bruckert

11
@ StéphaneBruckert non è sempre il caso che super.method()deve essere chiamato per primo. Dipende da cosa fa il metodo della superclasse. In questo caso FragmentActivity, alcune inizializzazioni sono necessarie per far setContentViewfunzionare correttamente. Tuttavia, in un altro metodo (diciamo onKeyUp) potresti voler fare condizionalmente un po 'di lavoro con l'azione, ma fallback su super.onKeyUpnel qual caso molto probabilmente vorrai chiamare super.onKeyUpalla fine della funzione.
Rivestito:

Probabilmente vale anche la pena notare che super()(il costruttore della superclasse) deve essere la prima funzione chiamata in qualsiasi costruttore di classi figlio, tuttavia chiamarla non è necessariamente obbligatoria (dipenderà interamente dalla classe che viene estesa).
Rivestito:

17

I frammenti non possono essere nidificati in XML

L'ho imparato nel modo più duro: se annidate un <fragment>tag basato sul layout XML all'interno di un frammento (potenzialmente) caricato dinamicamenteFragmentManager , allora inizi a ottenere strani errori, provando a gonfiare il tuo frammento xml.

Si scopre che questo non è supportato - funzionerà bene se lo fai solo attraverso ilFragmentManager approccio.

Stavo riscontrando questo problema perché stavo provando a caricare un frammento all'interno di un file <DrawerLayout>da xml e questo stava causando un arresto anomalo del onCreateView()metodo quando ho estratto lo stack posteriore.


Questo non è ancora supportato? A partire daappcompat-v7:23.3.0
Thanassis,

Sì, sto annidando il frammento all'interno di XML. Lo esaminerò.
KDeogharkar,

Ma esiste soluzioni / hack per il problema: stackoverflow.com/a/14695397/860488
Morten Holmgaard

2
Vedere la nota alla fine di questa sezione per la conferma: developer.android.com/about/versions/…
Philippe

non so perché la soluzione sia così semplice. per me, basta sostituire <fragment>con <frameLayout>lavorato. Lo sto ancora capendo. - stackoverflow.com/a/19167009/5477548
yoad w

16

Avevo lo stesso problema che stai affrontando. Nessuno dei suggerimenti in cima mi ha aiutato. Successivamente, ho scoperto che tutto ciò che dovevo fare è correggere le mie importazioni da:

import android.app.Fragment;

per:

import android.support.v4.app.Fragment;

Grazie, questa soluzione ha funzionato anche per me. Ho avuto problemi con questo problema per 2 giorni. Finalmente la tua soluzione ha funzionato per me. Grazie hdemirchian ..
Lakshmanan,

Sei fantastico! Il mio problema era opposto: la procedura guidata Frammento importa android.support.v4.app.Fragment per impostazione predefinita. E la mia attività principale estende android.app.Activity.
Freak controllo industriale

12

Hai provato:

 <fragment
            android:name="de.androidbuch.activiti.task.TaskDetailsFragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

1
Ci hai mostrato 1 file xml, ma dovresti averne uno in / layout / e uno in layout-land /
Blundell,

12

Assicurarsi che non vi siano eccezioni sollevate nel metodo onCreateView del frammento. Se viene generata un'eccezione in questo metodo, logcat non mostrerà i dettagli esatti dell'eccezione, ma mostrerà sempre il messaggio:

Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.fragment" 
on path: DexPathList[[zip file "/data/app/com.package/base.apk"],
nativeLibraryDirectories=[/data/app/com.package/lib/arm64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)

Solo per aggiungere ciò che sta dicendo Lei, prova a cercare il codice all'interno della tua vista virtuale e scopri la vera causa principale. Grazie Lei!
Swaroop,

6

Se la tua TaskDetailsFragmentestensione android.app.Fragment, cambia in onCreateView() .

Restituisci la vista che vuoi mostrare nel frammento o converti il ​​layout in vista usando LayoutInflater e restituiscilo.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View mainview = inflater.inflate(R.layout.main, null);
    return mainview;
}

Spero che funzioni. :)


6

Controlla il tuo percorso di classe, questo potrebbe essere il gonfiatore della vista non è riuscito a trovare la definizione della tua classe come definita nel tuo xml class = "de.androidbuch.activiti.task.TaskDetailsFragment" il percorso sopra potrebbe essere sbagliato.


6

Stavo ricevendo questo errore per diversi motivi.

I passaggi per riprodurre:

~> Il mio problema era che ho creato una nuova applicazione vuota.

~> Ho quindi generato un frammento personalizzato dal menu File ~> Nuovo file.

~> Continua per personalizzare il frammento aggiungendo layout, pulsanti, ecc.

~> Ha fatto riferimento al nuovo frammento personalizzato in Activity_my.xml generato automaticamente che è stato generato per me durante la creazione dell'applicazione. In questo modo l'XML ha potuto generare gli oggetti per me.

Ecco come catturare quando genera il frammento personalizzato tramite File ~> Nuovo menu File genera automaticamente uno stub di interfaccia e lo posiziona nella parte inferiore del file della classe di frammento.

Ciò significa che la tua classe MyActivity deve implementare questa interfaccia. In caso contrario, l'errore sopra riportato si verifica solo quando si fa riferimento al frammento da XML. Rimuovendo completamente il riferimento per il frammento in XML e creando il frammento tramite il codice nel file di classe MyActivity.java Logcat genera un errore più conciso che spiega il problema in dettaglio e si lamenta dell'interfaccia. Ciò è dimostrato nel modello di progetto Attività + Frammento. Tuttavia, <~ quel modello di progetto non genera lo stub di interfaccia.


5

Per me è stato dopo lo scorrimento nella traccia dello stack che ho trovato che mi mancava l'autorizzazione per android.permission.ACCESS_NETWORK_STATE

dopo aver aggiunto questa autorizzazione è stato corretto


1
Not to self: "scorri l' intera traccia dello stack. Grazie @Gil.
Batandwa

4

Se disponi di file di layout separati per le modalità verticale e orizzontale e ricevi un errore di inflazione ogni volta che cambi orientamento dopo aver fatto clic su un elemento, molto probabilmente c'è una discrepanza tra i tuoi file di layout.

Quando viene visualizzato l'errore, è solo quando si fa clic sull'elemento in modalità orizzontale o solo in modalità verticale o entrambi? La tua attività TaskDetailsFragment utilizza un file di layout che potrebbe presentare discrepanze tra le modalità orizzontale e verticale?


Grazie per la tua risposta .. bene ho solo un frammento in modalità orizzontale e non in modalità verticale. Quindi posso fare clic solo in modalità orizzontale per vedere il frammento. E dopo essere passato di nuovo alla modalità orizzontale ricevo questo errore ...
tsync,

Questo è quasi sicuramente il problema allora: hai una vista in modalità verticale che non può essere trovata in modalità orizzontale. L'aggiunta del frammento a landscape risolve il problema?
Nathan Fig,

1
Puoi avere viste che non esistono in entrambi i file - questo è il punto di avere layout separati per -land e -port. Tuttavia, controlla gli ID: avevo l'ID mancante nel mio file verticale e ho riscontrato questo errore durante il passaggio.
maxpolun

4

Se stai aggiungendo Fragmentstaticamente, cioè in xml, potresti aver perso l'implementazione OnFragmentInteractionListenernella tua Activityclasse. Quindi l'implementazione dell'interfaccia risolverebbe il problema. Se stai aggiungendo Fragmentdinamicamente, cioè nella classe java, questa non è la soluzione. Perché IDE stesso non ti consentirà di procedere senza implementare le interfacce richieste.


3

Il mio problema in questo caso era una semplice istanza di avere un'eccezione puntatore null stupido in uno dei miei metodi che veniva invocato più avanti nel ciclo di vita. Ciò stava causando per me l'eccezione "Errore durante il gonfiaggio del frammento di classe". In breve, ricordarsi di controllare più in basso la traccia dello stack delle eccezioni per una possibile causa.

Dopo aver risolto l'eccezione del puntatore null, il mio frammento è stato caricato correttamente.


3

Nessuna delle soluzioni sopra menzionate mi ha aiutato. Nel registro ho trovato i dettagli dell'eccezione come indicato di seguito:

06-19 16:20:37.885: E/AndroidRuntime(23973): Caused by: java.lang.RuntimeException: API key not found.  Check that /meta-data/ android:name="com.google.android.maps.v2.API_KEY" android:value="your API key"/ is in the application element of AndroidManifest.xml.

L'ho fatto e il mio codice funzionava!

<meta-data  android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCl1yGPZ3mpxxxxxxxAz2R-t7zcWVzrHUL9k"/>
</application>

3

Se non vuoi cambiare nulla e vai con il tag " frammento "

Fai questo,

<fragment
 android:visibility="gone" (Visibility will not work, just helps in removing frag from xml viewer)(If you want the visibility to be gone make it in your fragment root element visibility=gone)
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:name="com.example.YOUR_FRAGMENT" (This is important)
 />

2

Aveva lo stesso tipo di errore, dove veniva visualizzato esattamente lo stesso messaggio di errore in logcat. Avevo bisogno di apportare modifiche al Java Build Path che si trova sotto Project->Properties. Avevo incluso librerie relative a Google Maps come android-support-v4.jare google-play-services.jar; tuttavia mi mancava includendo questi sul 'Build class path'nel'Order and Export' menu delle opzioni. Forse l'errore sta qui.

Prova a includere le librerie nel percorso della classe di generazione.

L'ordine con cui vengono create le classi potrebbe anche innescare l'errore, quindi il mio consiglio è anche quello di provare a riorganizzare l'ordine del percorso di costruzione. L'errore è scomparso quando ho usato il seguente ordine: 'my_project_name/src'->'my_project_name/gen'->'Android Private Libraries'. L'ultima unità contiene i file jar menzionati in precedenza.


1

Nel tuo file xml basta usare un invece del tag. Il gonfiatore tenta di creare un android.app.Fragment dal quale non funzionerà su API <10. Quindi è necessario creare un gruppo di viste di tipo diverso.



1

assicurati di aver usato questo

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyBEwmfL0GaZmdVqdTxxxxxxxx-rVgvY" />

non questo..

<meta-data 
         android:name="com.google.android.gms.version" 
          android:value="AIzaSyBEwmfL0GaZmdVqdTCvxxxxxxx-rVgvY" /> 

1

Ho appena avuto questo stesso errore. La ragione della mia era la visibilità della mia classe di frammenti. È stato impostato sul valore predefinito, dovrebbe essere pubblico.


1

Potresti pubblicare frammenti onCreatee onCreateViewmetodi? Ho avuto esattamente la stessa eccezione che era stata causata da un'eccezione nel onCreatemetodo del frammento , quando ho risolto quel problema correggeva il frammento di classe che gonfiava l' errore.


1

Stavo ricevendo questo errore in Android Studio il problema era che il mio frammento aveva un layout relativo mentre il codice sulla funzione OnCreateView era

mDrawerListView = (ListView) inflater.inflate(
                R.layout.fragment_navigation_drawer, container, false);

il tuo codice sta facendo la stessa cosa?


1

Se vuoi ereditare AppCompatActivity , puoi fare qualcosa del genere- Nell'attività xml, usa un FrameLayout come questo-

<FrameLayout
    android:id="@+id/result_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/progress_frame"/>

e nell'attività onCreate-

final FragmentManager supportFragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = supportFragmentManager.beginTransaction();
    ft.replace(R.id.result_fragment, fphResultActivityFragment, "result fragment");
    ft.commitAllowingStateLoss();

Grazie questo aiutato. Non sono sicuro del motivo per cui sono stato in grado di utilizzare <framment> nel mio layout con successo in altre app su cui ho lavorato, ma non funzionava qui!
SingularityFuture,

basta notare che può funzionare, ma di solito è per frammenti dinamici non statici
Tanner Summers,

1

Ho avuto lo stesso errore, ma il mio problema era che il mio frammento non aveva un ID nel layout XML dell'attività genitore.


1

Dopo un giorno di difficoltà ho scoperto che è possibile che tu stia affrontando lo stesso,

Se tutto funziona come il codice di Google, controlla nel mio caso il file manifest. Ho aggiunto la chiave geografica e la chiave della mappa, ecco perché si verifica un'eccezione,

Nota: non aggiungere due chiavi nel file manifest per rimuovere la chiave della mappa

meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_key"/>

sopra il codice e aggiungi questo codice.

 <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/auto_location"/>

 <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>

1

Ho avuto un problema simile; dopo aver eseguito l' esempio AdMob , ho provato a inserire annunci nella mia app, causando questo errore:

01-02 16:48:51.269    8199-8199/it.dndc.BreathPlot E/AndroidRuntime FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not execute method of the activity
 Caused by: android.view.InflateException: Binary XML file line #57: Error inflating class fragment

La soluzione è: non è possibile inserire il frammento di un annuncio in un ListActivity. Invece, potrei aggiungerlo a un FragmentActivity e ad un ActionBarActivity senza alcun problema.

Il mio consiglio è: inizia dall'esempio di AdMob e aggiungi la tua app esistente: avrei risparmiato un sacco di tempo !!!


1

Se usi l'offuscamento con il componente Navigazione, devi escludere il frammento di Android e i tuoi argomenti. Aggiungi queste righe ai file delle regole proguard:

# Exclude the fragments and argType for navigation component.
-keep class * extends androidx.fragment.app.Fragment{}
-keep class com.safetonet.presentation.features.parent.adddevice.model.PresentableAddDeviceData
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.