android.view.InflateException: İkili XML dosyası: Sınıf parçasını şişirme hatası


151

Açıklayamadığım çok sinir bozucu bir hata var. Android AppCompatEski sürümlerle uyumlu hale getirmek için kullanılan bir Android uygulaması oluşturdum . İşte benim ana faaliyet düzeni dosyam:

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

İşte işimin ana kodu:

public class MainActivity extends ActionBarActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   }
}

Burada ana sorun: yukarıdaki kod neredeyse cihazlarda (uyarılmış cihaz veya bazı gerçek cihazlar) sorunsuz çalışır. Ama Samsung S3'te çalıştırdığımda. Bu hatayı fark eder:

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)

Lütfen hatayı nasıl düzeltebileceğini söyle, teşekkürler :)


1
Bu satırda, sınıf adının ve paket adının doğru olup olmadığını kontrol edersiniz ..android: name = "com.hqt.hac.view.fragment.NavigationDrawerFragment"
pvs

1
kontrol ettim ve bu sınıf doğrudur. Samsung s3 değil, bazı cihazlarda derleyebilir ve çalıştırabilirsiniz. Ben burada bazı garip sorunlar düşünüyorum :(
hqt

Eğer bazı cihaz üzerinde çalışıyor ve s3 değil, bu garip bir sorun varsa haklısın ... benim tavsiye bir kez sherlacFragment chek bir kez kullanmaya çalışın ..
pvs

Burada sorunu zaten çözdüm: stackoverflow.com/a/33128448/4366715 .
daniel kilinskas

1
Bu hatanın nedenini teşhis etmeye çalışanlar için: Buradaki anekdot düzeltmeleri kırmızı bir ringa balığıdır. Parçanın şişirilmesi sırasında yığın izinde görünmeyen bir istisna söz konusudur . Herhangi bir şey olabilir. Sorunu çözmek için, önceki istisnanın ne olduğunu bulmalısınız. Bunu yapmak için cevabımı veya @ DaveHubbard'ın.
LarsH

Yanıtlar:


126

Hata ayıklama için uzun bir süre sonra bu sorunu çözdüm. (Yine de nedenini açıklayamama rağmen). Ben özelliği android:namedeğiştirmek class. (Android Dokümanında olmasına rağmen, bu özelliklerin aynı olduğunu söylüyorlar, ancak işe yarıyor !!!)

Yani, şunlardan değişmelidir:

 android:name="com.fragment.NavigationDrawerFragment"

için

class = "com.fragment.NavigationDrawerFragment"

Yani, yeni düzen şöyle olmalıdır:

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

Umarım bu yardım :)


4
Resmi Android eğitimini takip etmeye çalışırken bu sorunla karşılaştım. (Değişen Kişisel düzeltme android:idiçin class) benim için çalıştı. Ayrıca değiştirmek Fragmentiçin Lint uyarısı aldım fragment.
stevepastelan

9
@DownVoter: bu hata karıştırılmıyor. Ve neyse ki düzeltmenin yolunu buluyorum. Gönderim hatanızı düzeltemezse gerçekten üzgünüm, çünkü nedenini de açıklayamıyorum. Ama bence aşağı oy almamalı. :)
hqt

2
Eğer güvenilir bir daha bu felaketi var acaba olmadan değişen nameiçin class, birkaç kullanıcıların bu kilitlenme durumunu bildirdiğinde ama kendim REPRO edemez oldu!
Daniel Wilson

8
Benim için çalışmıyor. Çok yorgunum. 2h dev ve neden çalışmıyor (Binary xml dosya satırı ... hata şişirme sınıf parçası). Herhangi bir fikir ?
Cocorico

32

Verilen cevapları kullanarak sorunumu çözemedim. Sonunda bunu değiştirdim:

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

buna :

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

ve çalışıyor.
Parça içinde kullanıyorsanız , getSupportFragmentManager yerine getChildFragmentManager kullanın .


31

TL / DR : Daha üst düzey mizanpaj XML'inden referans alınan bir parçanın oluşturulması sırasında kural dışı durum oluştu . Bu istisna, üst düzey mizanpaj enflasyonunun başarısız olmasına neden oldu, ancak ilk istisna bildirilmedi ; yığın izinde yalnızca daha yüksek düzeydeki enflasyon hatası ortaya çıkar. Temel nedeni bulmak için , ilk özel durumu yakalamanız ve günlüğe kaydetmeniz gerekir .


Hatanın ilk nedeni çok çeşitli şeyler olabilir, bu yüzden burada her kişi için sorunu neyin düzelttiği konusunda çok farklı cevaplar vardır. Bazıları için bu ile yapmak zorunda id, classya da nameniteliklerini. Diğerleri için bunun nedeni bir izin sorunu veya oluşturma ayarıdır. Benim için bunlar sorunu çözmedi; bunun drawable-ldrtl-xhdpiyerine, uygulanabilir bir yerde değil, sadece içinde var olan bir çekilebilir kaynak vardı drawable.

Ama bunlar sadece detaylar. Büyük resim sorunu, logcat'te görünen hata mesajının her şeyi başlatan istisnayı tanımlamamasıdır. Daha üst düzey bir düzen XML'si bir parçaya başvurduğunda, parçanın onCreateView()adı çağrılır. Bir parçanın istisnası oluştuğundaonCreateView() (örneğin parçanın düzen XML'sini şişirirken), daha yüksek düzey düzen XML'sinin şişmesinin başarısız olmasına neden olur. Bu üst düzey enflasyon hatası, hata günlüklerinde bir istisna olarak bildirilen şeydir. Ancak ilk istisna, rapor edilecek kadar zinciri yukarı doğru hareket etmiyor gibi görünüyor.

Bu durum göz önüne alındığında, soru, hata günlüğünde görünmediğinde ilk istisnanın nasıl ortaya çıkarılacağıdır.

Çözüm oldukça basittir: Parçanın içeriğinin etrafına bir try/ catchblok koyun onCreateView()ve catchyan tümcesinde istisnayı günlüğe kaydedin:

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

Hangi parça sınıfının onCreateView()bunu yapacağının, bu durumda, soruna neden olan düzende kullanılan her parça sınıfına yapacağı açık olmayabilir . Örneğin, OP durumunda, istisnanın gerçekleştiği uygulamanın kodu

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

hangisi

   setContentView(R.layout.activity_main);

Bu nedenle onCreateView(), mizanpajda belirtilen herhangi bir parçanın istisnalarını yakalamanız gerekir activity_main.

Benim durumumda, kök neden istisnası olduğu ortaya çıktı

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}

Bu istisna, yakalanıp onCreateView()açıkça oturum açana kadar hata günlüğünde görünmedi . Günlüğe kaydedildikten sonra, sorun teşhis ve düzeltmek için yeterince kolaydı ( bir nedenden ötürü details_view.xmlsadece ldrtl-xhdpiklasörün altında vardı ). Anahtar, sorunun kökü olan istisnayı yakalamak ve ortaya çıkarmaktı.

Bunu, tüm parçalarınızın onCreateView()yöntemlerinde kaynatma plakası olarak yapmak zarar vermez . Orada yakalanmamış bir istisna varsa, ne olursa olsun etkinliği çökertecektir. Tek fark, istisnayı yakalar ve oturum onCreateView()açarsanız, neden olduğu konusunda karanlıkta olmayacaksınız.

PS Bu cevabın @ DaveHubbard ile ilgili olduğunu fark ettim, ancak temel sebebi bulmak için farklı bir yaklaşım kullanıyor (logging vs. debugger).


2
Muhtemelen beni saatlerce hata ayıklamadan kurtardın. Kudos!
Szymon Sadło

16

Ben aynı sorun vardı, sorun, boşuna bu konu tüm cevapları çalıştı. Benim çözümüm, Etkinlik XML'sine bir kimlik eklememiştim. Bunun önemli olacağını düşünmemiştim, ama önemliydi.

Etkinlik XML'de:

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

Ancak:

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

Birisi bunun neden olduğu hakkında yorum yapmaktan mutluluk duyarsa, ben kulaklarım, diğerine, umarım bu yardımcı olur.


1
Teşekkürler, bu benim için çalıştı. Aylardır bir kimliği atlıyordum, ancak bazı düzen değişikliklerinden sonra aniden bu çökmeye başladım. Android tuhaf.
erisco

Cevap sen benim için çalışıyor. Sadece neden hiçbir yerde kullanmadığımda id özniteliğini koymak varsayalım merak ediyorum. Bana açıklayabilir misin?
Moshii

12

Artık sizin için gerekli olmayabilir, ancak daha fazla okuyucu bunu yararlı bulursa. Bende aynısı var android.view.InflateException:...Error inflating class fragment. Tüm doğru kütüphaneleri dahil ettim. AndroidManifest.xmlDosyaya bir kullanıcı daha ekleyerek çözüldü yani<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Btw koşuyordum Android Studio 0.8.9 on Ubuntu 12.04.


Benim için çalıştı! Çok teşekkürler!
Dadan

12

Aynı problemim var çünkü dinleyiciyi uygulamadım. İle aşağıdaki koda bakın /*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, fragman sınıfım aşağıdaki gibi bir şey:

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

Düzenle:

Bir istisna olduğunda ben de başka koşullarda bu aynı hata iletisini fark onCreatefonksiyonu Fragment. Aşağıdaki gibi bir şey var:

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

Bu parçayı tekrar kullandığım için, argümanları toplamayı unutuyorum. Sonra sonucudur getArguments()olduğunu null. Açıkçası, nullburada bir işaretçi istisnası var. Bunun gibi hatalara da göz atmanızı öneririm.


1
Teşekkürler! Bu çok yardımcı oldu!
DLee

8

NavigationDrawerFragment'ınız android.support.v4.app.Fragment'ı mı genişletiyor? Başka bir deyişle, doğru paketi mi alıyorsunuz?

import android.support.v4.app.Fragment;

6

Ben de bu sorunu yaşadım. Ve içindeki ithalatı değiştirerek çözdüm MainActivityveNavigationDrawerFragment

itibaren

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

için

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

Etkinlik yerine MainActivitygenişletilecek şekilde güncelledimActionBarActivity

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks

ActionBar actionBar = getSupportActionBar();ActionBar'ı almak için de kullanın

Ve ben aşağıdaki fonksiyonu güncelledim NavigationDrawerFragment

private ActionBar getActionBar()
{
    return ((ActionBarActivity)getActivity()).getSupportActionBar();
}

Bence bu doğru cevap. Ancak ActionBarActivity yerine (kullanımdan kaldırılmadı) AppCompatActivity kullandım ve ayrıca içe aktarma android.app.ActionBar'ı (onAttach yöntemi kullandıkça) kaldırmayın
GramThanos

6

Ben bu sorunla karşı karşıya ve aşağıdaki kodları kullanarak çözüldü. Alt parça yöneticisini kullanarak parça işlemine başlıyordum.

Yerleşim:

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

fragman işlemine nasıl başladım:

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

Aşağıdaki kodlar childfragmentmanger kullanarak eklenen parçayı nasıl kaldırdığımı açıklar.

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

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

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

        youTubePlayer = null;
    }

TY Ali. Günümü kurtardın!
vm345

İyi çalışıyor. Teşekkür ederim!
Polyariz

4

Benzer sorunları açıp kapadım. Hata mesajı, gerçek nedene bakılmaksızın genellikle çok az ayrıntı sağlar. Ama daha yararlı bilgiler edinmenin bir yolunu buldum. İç android sınıfı 'LayoutInflater.java' (android.view paketinde), bir istisnayı yeniden atan, ancak ayrıntıları almayan bir 'şişirme' yöntemine sahip olduğu ortaya çıkıyor, bu nedenle neden hakkında bilgi kaybediyorsunuz.

AndroidStudio'yu kullandım ve 'inflate' yönteminde genel bir istisna için catch bloğunun ilk satırı olan LayoutInflator line 539'da (çalıştığım versiyonda) bir kesme noktası ayarladım:

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

Hata ayıklayıcıda 'e'ye bakarsanız, bir' neden 'alanı görürsünüz. Gerçekte ne olduğu hakkında size bir ipucu vermede çok yardımcı olabilir. Bu, örneğin, dahil olan bir parçanın üst kodunuzda kullanılmasa bile bir kimliği olması gerektiğini buldum. Veya bir TextView öğesinin boyutla ilgili bir sorunu olduğunu.


3

Birisinin buna ihtiyacı olması durumunda. Varsayımlar: Uygulamayı başlatmak için cihaz telefonu USB kablosuna bağlandı ve IDE'niz okundu. Sorunu belirlemek için komut istemine gidin: adb logcat komutunu girin

Ardından uygulamanızı IDE'den başlatın. Bir istisna olacak.

Benim durumumda: Sürüm 2.3'ün bir Android uygulamasını "Uzay" widget'ını desteklemeyen bir mobil cihaza dağıtıyordum


3

Bu sorun, farklı bir sınıfı (bu durumda bir görünüm) genişleten ve sınıfın gerektirdiği tüm yapıcıları almayan özel bir sınıfınız olduğunda oluşur.

Örneğin: ortak sınıf CustomTextView, TextView {} öğesini genişletir

Bu sınıf 4 yapıcıya sahip olacak ve herhangi birini kaçırırsanız çökecekti. Aslında, Lollipop tarafından kullanılan sonuncuyu kaçırdım, bu yapıcıyı ekledi ve iyi çalıştı.


2

Ayrıca build.gradle'da (app) aşağıdakileri eklememiz gerekir

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

yeni düzenler veya yeni tasarım özellikleri kullandığımızda. umarım bu sana yardımcı olur.


2

Önceki bir gönderide belirtildiği gibi,
yeniden adlandırın

android:name="com.fragment.NavigationDrawerFragment"

için

class = "com.fragment.NavigationDrawerFragment"

Yine de, benim için işe yaramadı. Daha sonra com.fragment kısmı olmadan Sınıf Adı kullandım ve işe yaradı. Bu yüzden sonunda değiştirin

class = "NavigationDrawerFragment"

2

Buradaki yanıtların hiçbiri bana yardımcı olmadıktan sonra, parçamdaki onCreateView'in her satırında (sizin durumunuzda NavigationDrawerFragment) hareket eden uygulamayı hata ayıklama modunda çalıştırmayı seçtim. Ve parçanın bir NullPointerException nedeniyle şişirme konusunda zorluk çektiğini fark ettim. Örneğin

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

Burada mySeekBar null olarak ayarlandı (çünkü uygun düzende denetimi eklemeyi kaçırmıştım) ve sonraki satır InflateException olarak çıkan NPE'ye girdi. Ayrıca, yukarıda önerildiği gibi android: name to class.

Bu sorun yukarıda belirtilen çeşitli nedenlerle ortaya çıkabilir. Neyin yanlış olduğunu bilmek için satır satır hata ayıklama akışını öneririm.


Ve bu hata bir parçanın onCreateView()yönteminde mi meydana geldi ?
LarsH

1

Hala bunun için bir çözüm bulamayan bazılarınız için, benim durumumda bir OOM (Bellek Yetersiz) sorunum olduğu için oluyordu. Bu, örneğin uygulamanızda uzun süre kullanıldığında bir bellek sızıntısı olduğunda meydana gelebilir. Yığın izlememde asıl sebep buydu.


1

Bunun yardımcı olup olmayacağını bilmiyorum.

Ben şişirmek için çalışıyordu düzeninde vardı bir TextView ile bu sorunu vardı ( android.view.InflateException: İkili XML dosya satırı # 45: Sınıf TextView şişirme hatası ).

Ben aşağıdaki XML öznitelik android ayarlamıştı: textSize = "? Android: attr / textAppearanceLarge" hangi düzeni şişirilmiş izin vermedi.

Nedenini bilmiyorum, ( Android için hala biraz yeniyim - bir yıldan az deneyim ), sistem özniteliklerini çağırmakla ilgili bir şey olabilir, idk, bildiğim tek şey düz eski @ kullandığım anda dimen / md_text_16sp ( benim bir gelenek ), problem çözüldü :)

Bu yardımcı olur umarım...


Hiçbir fragmanım veya textSize android özniteliğim yoktu. Benim hatam: yerine TextAppearance.AppCompat devralma özel bir stil ile bir TextInputLayout ile ilgili Widget.Design.TextInputLayout. stackoverflow.com/questions/19874882/…
Junior Mayhé

1

4.4.2 cihazda bu vardı, ama 5 + iyiydi. Nedeni: Özel bir görünümün başlatılmasında, TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)API 21+ olan bir a oluşturuyordum .

Android Studio 2.1, açıklamalı olmasına rağmen şikayet etmiyor TargetApi(21). Görünüşe göre, Android Studio 2.2 bunu düzeltir ve bir hata olarak düzgün bir şekilde gösterir.

Umarım bu birine yardımcı olur.


1

Partiye biraz geç kaldım ama bu cevapların hiçbiri benim durumumda bana yardımcı oldu. Her iki parçamda Google haritasını SupportMapFragment ve PlaceAutocompleteFragment olarak kullanıyordum . Tüm cevaplar, sorunun SupportMapFragment'ın yeniden oluşturulacak ve yeniden çizilecek harita olmasıyla ilgili olduğuna işaret etti.

Ancak PlaceAutocompleteFragment ile de sorunum vardı. İşte SupportMapFragment ve SupportMapFragment nedeniyle bu sorunla karşılaşanlar için çalışma çözümü

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

    }

OnDestroyView'da SupportMapFragment ve SupportMapFragment öğelerini temizleyin

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


}

1

Uzun süren denemelerden sonra, yukarıdaki cevapların hiçbiri yapamadıktan sonra sorunu bu şekilde çözdüm.

  1. Bunun yerine etkinliğiniz AppCompatActivityiçin genişletin .MainActivity
  2. Ekle android:theme="@style/Theme.AppCompat.Light"için senin <Activity..../>içindeAndroidManifest.xml
  3. Senin içinde NavigationDrawerFragmentClass, senin değiştirmek ActionBarörneklerini için

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

DÜZENLE

Etkinlik ve Düzen arasında bir tutarlılık olmalıdır . Eğer Düzeni birine sahip AppCompat Tema , Like Theme.AppCompat.Light, sizin Etkinlik gerekir extends AppCompatActivity.

Burger simgesine ve Android Gmail Uygulaması'na benzeyen bir Gezinme Çekmecesine sahip olmak istedim , ancak çirkin bir Gezinme Çekmecesi buldum . Bütün bunlar çünkü tüm Sınıflarım yerine .extends ActivityAppCompatActivity

Tüm projeyi genişletmek için yeniden çarpanlara ayırdım AppCompatActivity, sonra Sağ Tıkla Layout Folder, seç new-> ve Activitysonra Navigation Drawer ActivityBoom, her şey benim için yapılır!


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

Görünüm şişirilemeyen herhangi bir şey olabilir, bu tür bir hata, XML dosyasında atıfta bulunulan bir görünümün sınıf adlarını veya ad niteliğini çözme konusunda bir çakışma olduğunda ortaya çıkar.

Aynı hatayı aldığımda UI-XML dosyasında her şeyi temiz ve güvenli hale getirdim, kullandığım görünüm,

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

Malzeme bileşenleri özelliğine atıfta bulunan bir stil özniteliği kullanıyordum. Ama styles.xml dosyamda ...

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

Sınıf çözümünün çatışma ile karşı karşıya olduğu yer. Görünüm özelliklerim, uygulama temamda tanımlanmayan bir mülke başvuruyor. Maddi bileşenlerden doğru ana tema bana yardımcı oldu. Bu nedenle üst özelliği ...

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

Bu da sorunu çözdü.


0

Ben temel sorun AndroidManifest.xml tanımlanan "android: targetSdkVersion" ile olduğunu düşünüyorum. Benim durumumda, tanımladığım ilk değer:

android:targetSdkVersion=16

Bunu şöyle değiştirdim:

android:targetSdkVersion=22

tüm hatamı çözdü. Bu nedenle, bir android uygulaması oluşturmadan önce doğru "targetSdkVersion" ın ayarlanması da önemlidir.


0

Başka birinin buraya gelmesi ve yanıtların sorunu çözmeye yardımcı olmaması durumunda, denemek için bir şey daha var.

Diğerlerinin de belirttiği gibi, bu genellikle Java'nızda yanlış yaptığınız bir şeyin aksine XML'in içinde yuvalanmış bir sorundan kaynaklanır. Benim durumumda, düzeltmek için süper kolay (ve aptal) bir hataydı.

Ben böyle kodu vardı:

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

Tek yapmam gereken, 'View' içindeki v'yi büyük harfle yazmaktı, böylece sistem onu ​​tanıdı. Özel görünümlerinizin (Veya Parçaların, geri dönüşüm görünümlerinin vb.) Hepsinin, XML otomatik tamamlama özelliğinin uygun görünümle eşleşmesi için uygun şekilde büyük harflerle yazılmış bildirime sahip olup olmadığını kontrol edin.


0

Ben de bu hatayı vardı ve çok uzun bir hata ayıklama sonra benim MainClass FrameActivity yerine Aktivite genişletilmiş Faaliyet olduğu için dikişli, benim durumumda, xml bir sorun değildi. Sana yardım etmeyi umuyorum.


0

Benim durumumda .

Şişirmeye çalıştığım düzen

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

etiketi, kaldırılarak düzeltildi.

Bir görünüm için tasarlanmış bir önceki düzeni görünüm çağrı adaptörü içine şişirmek çalışıyordum.


0

Benim hatam farklı bir sorundan kaynaklandı.

Bir Etkinliğinden parçasına bir demet geçiyordum. Parça parçasındaki paketi alan kodu yorumladığında hata gitti. Anlaşıldığı üzere, hatam aşağıdaki "getArguments ();" null dönüyordu parçası.

Bundle args = getArguments();

Etkinlik gönderme kodunu kontrol ettikten sonra, aşağıda aptalca bir hata yaptığımı fark ettim;

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

Okla aynı çizgide YENİ bir parça oluşturuyordum. Halbuki benim paketimde olan önceden başlatılmış parçayı kullanmalıydım. Yani şöyle olmalıydı:

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

Neden tam olarak bir NPE yerine bu hatayı atar bilmiyorum, ama birisi aynı senaryo olması durumunda bu benim hatamı çözdü


0

Aynı sorunu yaşıyordum, benim durumumda paket adı yanlıştı, düzeltmek sorunu çözdü.



0

Benim fragment.xml kökünde RecyclerView vardı, bu hata vardı,

ancak bir ViewGroup ile tamamladığımda, uygulama iyi çalıştı.


0

Gezinmeye bu ad alanını ekle

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">
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.