android.view.InflateException: двоичный файл XML: ошибка раздувания fragmentа classа

У меня очень неприятная ошибка, которую я не могу объяснить. Я создал приложение для Android, которое использует Android AppCompat чтобы сделать его совместимым со старыми версиями. Вот мой основной файл макета деятельности:

        

И вот основной код моей деятельности:

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

Основная проблема здесь: над кодом выполняется плавно на почти устройствах (стимулированное устройство или некоторые реальные устройства). Но когда я запускаю его на Samsung S3. Он замечает эту ошибку:

 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) 

Скажите, пожалуйста, как исправить ошибку, спасибо 🙂

После долгого времени для отладки я исправил эту проблему. (Хотя я все еще не могу объяснить, почему). Что я изменяю свойство android:name для class . (хотя в Android Document они говорят, что эти свойства одинаковы, но они работают !!!)

Поэтому он должен измениться:

  android:name="com.fragment.NavigationDrawerFragment" 

в

 class = "com.fragment.NavigationDrawerFragment" 

Итак, новый макет должен быть:

      

Надеюсь эта помощь 🙂

Я не мог решить свою проблему, используя предоставленные ответы. Наконец я изменил это:

  

к этому :

  

,

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

и это работает.
Если вы используете его внутри fragmentа, используйте getChildFragmentManager вместо getSupportFragmentManager .

Возможно, вам это больше не понадобится, но если дальнейшие читатели найдут это полезным. У меня есть то же самое android.view.InflateException:...Error inflating class fragment . У меня были все нужные библиотеки. Решено путем добавления еще одного пользовательского разрешения в файл AndroidManifest.xml т.е.

Btw Я запускал Android Studio 0.8.9 on Ubuntu 12.04.

У меня была та же проблема, проблема, пробовал все ответы в этом streamе безрезультатно. Мое решение состояло в том, что я не добавил идентификатор в XML активности. Я не думал, что это будет иметь значение, но так оно и было.

Итак, в XML-документе Activity я:

  

Но должно было:

  

Если кто-то будет рад прокомментировать, почему это так, я все уши, другим, надеюсь, это поможет.

У меня такая же проблема, потому что я не реализовал слушателя. См. Следующий код с /*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, мой class fragmentа выглядит примерно так:

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

Редактировать:

Я также замечаю это же сообщение об ошибке при других обстоятельствах, когда в функции onCreate Fragment есть исключение. У меня есть что-то в следующем:

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

Поскольку я повторно использую этот fragment, я полностью забываю задавать аргументы. Тогда результат getArguments() равен null . Очевидно, здесь я получаю исключение с null указателем. Я предлагаю вам следить за такими ошибками.

Ваш файл NavigationDrawerFragment расширяет андроид.support.v4.app.Fragment? Другими словами, вы импортируете правильный пакет?

 import android.support.v4.app.Fragment; 

У меня также был этот вопрос. Я решил это, заменив импорт в MainActivity и NavigationDrawerFragment

Из

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

к

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

Я обновил MainActivity для MainActivity ActionBarActivity вместо Activity

 public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks 

Также используйте ActionBar actionBar = getSupportActionBar(); получить ActionBar

И я обновил следующую функцию в NavigationDrawerFragment

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

TL / DR : Исключение произошло во время создания fragmentа, на который ссылается XML-код более высокого уровня. Это исключение привело к тому, что инфляция компоновки более высокого уровня не удалась, но начальное исключение не было сообщено ; в трассировке стека обнаруживается только более высокий уровень инфляции. Чтобы найти основную причину, вам нужно поймать и зарегистрировать начальное исключение .


Первоначальной причиной ошибки может быть большое разнообразие вещей, поэтому здесь так много разных ответов, что касается проблемы для каждого человека. Для некоторых это связано с атрибутами id , class или name . Для других это было связано с вопросом о разрешении или настройке сборки. Для меня это не устранило проблему; вместо этого существовал ресурс, который можно было бы использовать только в drawable-ldrtl-xhdpi , а не в применимом месте, таком как drawable .

Но это всего лишь детали. Проблема большого изображения заключается в том, что сообщение об ошибке, появившееся в logcat, не описывает исключение, которое запустило все это. Когда XML- onCreateView() более высокого уровня ссылается на fragment, onCreateView() этого fragmentа. Когда возникает исключение в onCreateView() для fragmentа (например, при раздувании XML-макета fragmentа), это приводит к onCreateView() уровня. Этот взлом инфляции более высокого уровня является тем, что сообщается как исключение в журналах ошибок. Но первоначальное исключение, похоже, не доходит до цепи достаточно хорошо, чтобы ее сообщали.

Учитывая эту ситуацию, вопрос заключается в том, как выявить первоначальное исключение, если оно не отображается в журнале ошибок.

Решение довольно просто: поместите блок try / catch вокруг содержимого onCreateView() , а в предложении catch onCreateView() исключение:

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

Возможно, не очевидно, какой из них будет onCreateView() в onCreateView() этого classа, и в этом случае сделать это с каждым classом fragmentа, который используется в макете, вызвавшем эту проблему. Например, в случае OP код приложения, в котором произошло исключение, был

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

который

  setContentView(R.layout.activity_main); 

Таким образом, вам нужно поймать исключения в onCreateView() любых fragmentов, на которые ссылается макет activity_main .

В моем случае исключение корневой причины оказалось

 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} 

Это исключение не onCreateView() в onCreateView() ошибок, пока я не поймал его в onCreateView() и не зарегистрировал его явно. Как только он был зарегистрирован, проблема была достаточно простой, чтобы диагностировать и исправлять ( details_view.xml существует только в ldrtl-xhdpi , по какой-то причине). Ключ поймал исключение, являющееся корнем проблемы, и разоблачение.

Это не больно делать это как шаблон во всех onCreateView() ваших fragmentов. Если в нем есть неперехваченное исключение, это приведет к сбою активности независимо. Единственное отличие состоит в том, что если вы поймаете и onCreateView() исключение в onCreateView() , вы не будете в неведении относительно того, почему это произошло.

PS Я просто понял, что этот ответ связан с @ DaveHubbard’s, но использует другой подход для поиска основной причины (ведение журнала против отладчика).

У меня были подобные проблемы. Сообщение об ошибке часто дает очень мало деталей, независимо от фактической причины. Но я нашел способ получить более полезную информацию. Оказывается, внутренний class Android LayoutInflater.java (в пакете android.view) имеет метод «раздувания», который перебрасывает исключение, но не получает детали, поэтому вы теряете информацию о причине.

Я использовал AndroidStudio и установил точку останова в строке 539 LayoutInflator (в версии, в которой я работаю), которая является первой строкой блока catch для общего исключения в этом методе «надуть»:

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

Если вы посмотрите на «e» в отладчике, вы увидите поле «причина». Это может быть очень полезно дать вам подсказку о том, что на самом деле произошло. Так, например, я обнаружил, что родительский элемент включенного fragmentа должен иметь идентификатор, даже если он не используется в вашем коде. Или что TextView имел проблему с измерением.

На всякий случай кому-то это нужно. Предположения. Телефон устройства подключен к USB-кабелю и чтение IDE для запуска приложения. Перейдите в командную строку, чтобы определить проблему: введите adb logcat

Затем запустите приложение из IDE. Вы сделаете исключение.

В моем случае: я развертывал приложение Android версии 2.3 на мобильном устройстве, которое не поддерживало виджет «Пространство»,

Эта проблема возникает, когда у вас есть собственный class, который расширяет class (в данном случае это представление) и не импортирует все конструкторы, требуемые classом.

Например: public class CustomTextView расширяет TextView {}

У этого classа было бы 4 конструктора, и если бы вы пропустили кого-нибудь, это сработало бы. На самом деле я пропустил последний, который использовал Lollipop, добавив, что конструктор и отлично работает.

я столкнулся с этой проблемой и решил ее, используя следующие коды. Я начал транзакцию fragmentа, используя диспетчер childfragment.

расположение:

   

вот как я начал транзакцию fragmentа:

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

следующие коды объясняют, как я удалил fragment, добавленный с помощью 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; } 

нам также необходимо добавить следующее в build.gradle (app)

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

всякий раз, когда мы используем новые макеты или новые конструктивные особенности. надеюсь, это поможет вам.

После того, как ни один из ответов здесь не помог мне, я решил запустить приложение в режиме отладки, перемещаясь по каждой строке onCreateView в моем fragmentе (NavigationDrawerFragment в вашем случае). И заметил, что fragment испытывает трудности с раздуванием из-за исключения NullPointerException. Например

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

Здесь mySeekBar был установлен в null (потому что я пропустил добавление элемента управления в соответствующий макет), а следующая строка попала в NPE, который вышел как InflateException. Кроме того, как было предложено выше, переименуйте android: name в class.

Эта проблема может возникнуть по разным причинам, упомянутым выше. Я бы порекомендовал streamовый stream отладки, чтобы узнать, что не так.

Я не знаю, поможет ли это.

У меня была эта проблема с TextView, который у меня был в макете, который я пытался раздуть ( android.view.InflateException: двоичная строка XML-файла # 45: ошибка раздувания classа TextView ).

Я установил следующий атрибут XML android: textSize = “? Android: attr / textAppearanceLarge”, который не позволял раздувать макет.

Не знаю точно, почему, ( я все еще немного новичок в Android – менее года опыта ), может иметь какое-то отношение к вызову системных атрибутов, idk, все, что я знаю, это как только я использовал простой старый @ dimen / md_text_16sp ( это мой обычай ), проблема решена 🙂

Надеюсь это поможет…

Я немного опаздываю на вечеринку, но Нон этого ответа помог мне в моем случае. Я использовал карту Google в качестве SupportMapFragment и PlaceAutocompleteFragment как в моем fragmentе. Поскольку все ответы указывали на то, что проблема заключается в том, что SupportMapFragment является картой, которую нужно воссоздать и перерисовать.

Но у меня также была проблема с PlaceAutocompleteFragment. Итак, вот рабочее решение для тех, кто сталкивается с этой проблемой из-за SupportMapFragment и 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); } 

И в onDestroyView очистить SupportMapFragment и 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; } } 

Я думаю, что основная проблема заключается в «android: targetSdkVersion», которая определена в AndroidManifest.xml. В моем случае начальное значение, которое я определил как:

android:targetSdkVersion=16

Я изменил его на:

android:targetSdkVersion=22

который разрешил мою ошибку. Таким образом, настройка правильной «targetSdkVersion» также важна до создания приложения для Android.

Если кто-то еще приходит сюда, и ответы не помогают решить проблему, еще одна вещь, чтобы попробовать.

Как отмечали другие, это обычно вызвано проблемой, вложенной в сам XML, а не тем, что вы сделали неправильно в своей Java. В моем случае это была супер легкая (и глупая) ошибка, чтобы исправить.

У меня был такой код:

  

Когда все, что мне нужно было сделать, это использовать v в «View», чтобы система переделала его. Убедитесь, что ваши пользовательские представления (или fragmentы, recyclerviews и т. Д.) Имеют правильную заглавную декларацию спереди, чтобы автозаполнение XML соответствовало соответствующему виду.

Для некоторых из вас, которые до сих пор не нашли решения для этого, в моем случае это происходило, потому что у меня была проблема с OOM (Out of Memory). Это может произойти, если у вас есть, например, утечка памяти в приложении при ее использовании в течение длительного времени. В моей трассе стека это была основная причина.

У меня было это на устройстве 4.4.2, но 5+ было в порядке. Причина: внутри инициализации пользовательского представления я создавал TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) , который является API 21+.

Android Studio 2.1 не жалуется на это, даже если он аннотируется TargetApi(21) . По-видимому, Android Studio 2.2 исправит это и правильно покажет его как ошибку.

Надеюсь, это поможет кому-то.

У меня тоже была эта ошибка, и после очень долгой отладки проблема была сфабрикована в том, что моя MainClass расширила Activity вместо FrameActivity, в моем случае xml не был проблемой. Надеюсь помочь тебе.

Как упоминалось в предыдущем посте,
переименовать

 android:name="com.fragment.NavigationDrawerFragment" 

в

 class = "com.fragment.NavigationDrawerFragment" 

Тем не менее, это не сработало для меня. Затем я просто использовал имя classа без части com.fragment и voila. Так что измените его, наконец, на

 class = "NavigationDrawerFragment" 

В моем случае .

Макет, который я пытался раздуть,

  

тег, удалив его, исправил его.

Я пытался раздуть предыдущий макет, предназначенный для Actvity, в адаптер view-pager.

Моя ошибка была вызвана другой проблемой.

Я передавал пакет из Activity в его fragment. Когда я прокомментировал код, получающий пакет в fragmentе, ошибка исчезла. Как оказалось, моя ошибка была вызвана ниже: «getArguments ();» которая возвращала значение null.

 Bundle args = getArguments(); 

После проверки кода отправки активности я понял, что у меня была глупая ошибка в ниже;

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

Я создал новый fragment в строке со стрелкой. В то время как я должен был использовать предварительно созданный fragment, который уже имел мой пакет. Так должно было быть:

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

Я не знаю, почему именно он выбрасывает эту ошибку вместо NPE, но это решило мою ошибку, если кто-то имеет тот же сценарий

У меня была одна и та же проблема, в моем случае имя пакета было неправильным, исправление этого решения проблемы.

После долгого времени попыток я решил эту проблему после того, как ни один из вышеперечисленных ответов не смог.

  1. Расширьте AppCompatActivity для Main деятельности вместо Activity .
  2. Добавьте android:theme="@style/Theme.AppCompat.Light" в свой в AndroidManifest.xml
  3. В своем classе NavigationDrawerFragment измените свои экземпляры ActionBar на

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

РЕДАКТИРОВАТЬ

Это должно быть согласованность между Activity и Layout . Если в макете есть одна из тем AppCompat , например Theme.AppCompat.Light , ваша активность должна Theme.AppCompat.Light extends AppCompatActivity .

Я хотел иметь значок гамбургера и навигационный ящик, который выглядит как приложение Android Gmail , но в итоге я оказался уродливым навигационным ящиком . Все это, потому что все мои classы extends Activity вместо AppCompatActivity .

Я повторно проанализировал весь проект, чтобы расширить AppCompatActivity , затем щелкнуть правой кнопкой Layout Folder , выбрал new -> Activity затем Navigation Drawer Activity и Boom, все сделано для меня!

Откройте gradle.properties и добавьте следующую строку:

 android.enableAapt2=false 

Ссылка: https://github.com/chrisjenx/Calligraphy/issues/417#issuecomment-365177808

  • Нарисуйте прозрачный круг за пределами
  • Выберите любой файл через Intent на Android
  • Как проверить доступ в Интернет на Android? InetAddress никогда не выбегает
  • Не удалось выполнить синхронизацию проекта Gradle после того, как Google объявила о новой системе управления версиями sdk
  • Примеры данных Android.os.Build, пожалуйста
  • Как я могу развернуть и выполнить приложение на устройстве, подключенном к удаленной системе?
  • Разрешение Android INJECT_EVENTS
  • Ошибка компиляции Android Hello-World: Intellij не может найти aapt
  • Как получить контакты из родной телефонной книги в Android
  • Мигающий текст в представлении android
  • Передача массивов с помощью Intent.putExtra
  • Давайте будем гением компьютера.