android.view.InflateException: Binarny plik XML: Błąd napełniania fragmentu klasy

151

Mam bardzo frustrujący błąd, którego nie potrafię wyjaśnić. Stworzyłem aplikację na Androida, która używa, Android AppCompataby 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 :)

hqt
źródło
1
W tym wierszu otrzymujesz wyjątek, sprawdź, czy nazwa klasy i nazwa pakietu są poprawne, czy nie ..android: name = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
kalyan pvs
1
sprawdziłem i ta klasa jest prawdziwa. mogę kompilować i uruchamiać na niektórych urządzeniach, ale nie na Samsungu S3. Myślę, że tutaj są jakieś dziwne problemy :(
hqt
masz rację, jeśli jest wykonywany na jakimś urządzeniu, a nie na s3 to dziwny problem ..
moja
Problem rozwiązałem już tutaj: stackoverflow.com/a/33128448/4366715 .
daniel kilinskas
1
Dla tych, którzy próbują zdiagnozować przyczynę tego błędu: anegdotyczne poprawki tutaj to czerwony śledź. Istnieje poprzedni wyjątek występujący podczas napełniania fragmentu, który nie pojawia się w śladzie stosu . To może być wszystko. Aby rozwiązać problem, musisz dowiedzieć się, jaki jest poprzedni wyjątek. Aby to zrobić, zobacz moją odpowiedź lub @ DaveHubbard's.
LarsH

Odpowiedzi:

126

Po długim czasie debugowania rozwiązałem ten problem. (Chociaż nadal nie mogę wyjaśnić, dlaczego). Że zmieniam właściwość android:namenaclass . (chociaż w dokumencie Androida mówią, że te właściwości są takie same, ale działa !!!)

Powinien więc zmienić się z:

 android:name="com.fragment.NavigationDrawerFragment"

do

class = "com.fragment.NavigationDrawerFragment"

Tak więc nowy układ powinien wyglądać następująco:

<!-- 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" />

Mam nadzieję, że to pomoże :)

hqt
źródło
4
Napotkałem ten problem, próbując postępować zgodnie z oficjalnym samouczkiem Androida. Twoja poprawka (zmiana android:idna class) zadziałała dla mnie. Dostałam też ostrzeżenie Lint do zmian Fragmentdo fragment, co ja.
stevepastelan
9
@DownVoter: ten błąd jest mylący. I na szczęście znajduję sposób, aby to naprawić. Naprawdę przepraszam, jeśli mój post nie może naprawić błędu, ponieważ nie mogę również wyjaśnić, dlaczego. Ale myślę, że nie powinno to być głosem negatywnym. :)
hqt
2
Zastanawiam się, czy otrzymałeś tę awarię niezawodnie bez zmiany z namena. classKilku użytkowników zgłosiło tę awarię, ale nie mogę jej powtórzyć!
Daniel Wilson
8
Nie działa na mnie. Jestem taki zmęczony. 2h dev i nie mogę znaleźć powodu, dla którego to nie działa (linia pliku binarnego xml ... błąd nadmuchujący fragment klasy). Dowolny pomysł ?
Cocorico
32

Nie mogłem rozwiązać problemu na podstawie udzielonych odpowiedzi. Wreszcie zmieniłem to:

<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" />

do tego :

<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();
    }

i to działa.
Jeśli używasz go wewnątrz fragmentu, użyj getChildFragmentManager zamiast getSupportFragmentManager .

ReZa
źródło
31

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, classlub nameatrybutó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 w drawable-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/ catchwokół zawartości fragmentu onCreateView(), aw catchklauzuli zapisz wyjątek:

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;
    }
}

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, to

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

który jest

   setContentView(R.layout.activity_main);

Musisz więc wychwycić wyjątki we onCreateView()wszystkich fragmentach, do których odwołuje się układ activity_main.

W moim przypadku okazał się wyjątek głównej przyczyny

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}

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ś powodu details_view.xmlistniał tylko w ldrtl-xhdpifolderze). Kluczem był wychwycenie wyjątku, który był źródłem problemu, i ujawnienie go.

Nie zaszkodzi robienie tego jako schematu we wszystkichonCreateView() 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ątku onCreateView(), 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).

LarsH
źródło
2
Prawdopodobnie zaoszczędziłeś mi godzin na debugowaniu. Sława!
Szymon Sadło
16

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:

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

Ale powinienem był:

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

Jeśli ktoś byłby szczęśliwy mogąc skomentować, dlaczego tak jest, mam wszystkie uszy, do innych, mam nadzieję, że to pomoże.

Gruchać
źródło
1
Dzięki, to zadziałało dla mnie. Od miesięcy pomijałem identyfikator, ale po kilku zmianach układu nagle zacząłem mieć tę awarię. Android jest dziwny.
erisco
Twoja odpowiedź działa dla mnie. Zastanawiam się tylko, dlaczego przypuszczam, że umieszczam atrybut id, skoro nigdzie go nie używam. Czy możesz mi wyjaśnić?
Moshii
12

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 w AndroidManifest.xmlpliku, tj<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Btw biegałem Android Studio 0.8.9 on Ubuntu 12.04.

Abu Shumon
źródło
Pracował dla mnie! Wielkie dzięki!
Dadan
12

Mam ten sam problem, ponieważ nie zaimplementowałem słuchacza. Zobacz poniższy kod z /*Add This!*/.

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

FYI, moja klasa fragmentów wygląda mniej więcej tak:

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);
    }
}

Edytować:

Zauważyłem również ten sam komunikat o błędzie w innych okolicznościach, gdy istnieje wyjątek w onCreatefunkcji Fragment. Mam coś takiego:

@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;
} 

Ponieważ ponownie wykorzystuję ten fragment, całkowicie zapomniałem ustawić argumenty. Wtedy wynikgetArguments() jest null. Oczywiście otrzymuję nulltutaj wyjątek wskaźnika. Zasugeruję, abyś również uważał na takie błędy.

Yuchen Zhong
źródło
1
Dzięki! To bardzo pomogło!
DLee
8

Czy twój NavigationDrawerFragment rozszerza android.support.v4.app.Fragment? Innymi słowy, czy importujesz właściwy pakiet?

import android.support.v4.app.Fragment;
Wang
źródło
6

Miałem też ten problem. Rozwiązałem to, zastępując import wMainActivity iNavigationDrawerFragment

Z

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

Do

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

Zaktualizowałem, MainActivityaby rozszerzyć ActionBarActivityzamiast Aktywności

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks

Użyj również ActionBar actionBar = getSupportActionBar(); aby uzyskać ActionBar

Zaktualizowałem następującą funkcję w NavigationDrawerFragment

private ActionBar getActionBar()
{
    return ((ActionBarActivity)getActivity()).getSupportActionBar();
}
Fr4nz
źródło
Myślę, że to właściwa odpowiedź. Ale użyłem AppCompatActivity zamiast ActionBarActivity (nie jest przestarzałe), a także nie usuwam importu android.app.ActionBar (ponieważ metoda onAttach go używa)
GramThanos
6

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:

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

tak zacząłem transakcję fragmentaryczną:

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

Poniższy kod wyjaśnia, w jaki sposób usunąłem fragment, który został dodany przy użyciu childfragmentmanger.

@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
źródło
TY Ali. Uratowałeś mi dzień!
vm345
Działa w porządku. Dziękuję Ci!
Polyariz
4

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 '':

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

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.

Dave Hubbard
źródło
3

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”

al881
źródło
3

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.

Sagar Devanga
źródło
2

musimy również dodać następujące elementy w build.gradle (aplikacja)

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

za każdym razem, gdy używamy nowych układów lub nowych funkcji projektu. mam nadzieję, że to ci pomoże.

Uma Achanta
źródło
2

Jak wspomniano w poprzednim poście,
zmień nazwę

android:name="com.fragment.NavigationDrawerFragment"

do

class = "com.fragment.NavigationDrawerFragment"

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

class = "NavigationDrawerFragment"
płynąć na zachód
źródło
2

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

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

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.

Vishy
źródło
I czy ten błąd wystąpił w onCreateView()metodzie fragmentu ?
LarsH
1

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.

Sam Bellerose
źródło
1

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

tl_
źródło
Nie miałem żadnych fragmentów ani atrybutu textSize android. Mój błąd był związany z TextInputLayout z niestandardowy styl dziedziczy TextAppearance.AppCompat zamiast Widget.Design.TextInputLayout:. stackoverflow.com/questions/19874882/…
Junior Mayhé
1

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.

Tomek
źródło
1

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

 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);

    }

W onDestroyView wyczyść SupportMapFragment i 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
źródło
1

Po długich próbach w ten sposób rozwiązałem problem, mimo że żadna z powyższych odpowiedzi nie mogła.

  1. Rozszerz AppCompatActivityswoją Mainaktywność zamiast Activity.
  2. Dodaj android:theme="@style/Theme.AppCompat.Light"do swojego <Activity..../>wAndroidManifest.xml
  3. W swojej NavigationDrawerFragmentklasie zmień swoje ActionBarinstancje na

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

EDYTOWAĆ

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ść powinna extends 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 Activityzamiast wszystkich moich klas AppCompatActivity.

Ponownie rozłożyłem cały projekt na czynniki AppCompatActivity, a następnie kliknij prawym przyciskiem Layout Foldermyszy, wybierz new-> Activitypotem Navigation Drawer Activityi Boom, wszystko jest zrobione za mnie!

Yahya
źródło
1
android.view.InflateException: Binary XML file line #16: Error inflating class com.google.android.material.bottomappbar.BottomAppBar

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,

   <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"/>

Używałem atrybutu stylu, który odnosił się do właściwości komponentów materiału. Ale mój styles.xml miał ...

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

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

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

Który rozwiązał problem.

Shrinivas Manjithaya
źródło
0

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.

Sanjeev
źródło
0

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:

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

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.

PGMacDesign
źródło
0

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

Copacel
źródło
0

W moim przypadku .

Układ, który próbowałem nadmuchać, miał

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

tag, usunięcie go naprawiło.

Próbowałem nadmuchać poprzedni układ zaprojektowany dla Actvity w adapterze przeglądania pagera.

mughil
źródło
0

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.

Bundle args = getArguments();

Po sprawdzeniu kodu wysyłającego aktywność zdałem sobie sprawę, że poniżej popełniłem głupi błąd;

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();

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ć:

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();

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

Amgad
źródło
0

Miałem ten sam problem, w moim przypadku nazwa pakietu była nieprawidłowa, naprawienie go rozwiązało problem.

Tincho825
źródło
0

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.

7odafarghal
źródło
0

Dodaj to pole nazwy w nawigacji

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
źródło