Intereting Posts
Как мы можем имитировать звонки и SMS в Android? Android перетащить и вернуться к предыдущей деятельности, например, Facebook и Google Фото Ошибка: отсутствует файл androidmanifest.xml -> Что мне не хватает? Неподдерживаемый тип мультимедиа для клиента поддержки Android Android. Где мы должны сохранять имя пользователя и пароль в памяти устройства? Http://dl-ssl.google.com/android/repository/addons_list.xml недоступен Как обновить бета-канал Android Studio Не удалось преобразовать @ drawable / в drawable Язык на основе JVM без языковой среды исполнения «Исключение: ошибка при создании экземпляра t! Первичная розетка уже зарегистрирована ». В приложении cordova angular2 Android – Как измерить качество полосы пропускания в локальной сети одним телефоном Как добавить библиотеку picasso в андроид-студию Android-studio Выбранный каталог недействителен для Android SDK Тихий вход для получения токена с помощью GoogleApiClient Android: Как вы скрываете вкладки в ActionBar?

Android.view.InflateException: двоичный файл XML: ошибка раздувания фрагмента класса

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

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

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

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

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

J

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

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

Solutions Collecting From Web of "Android.view.InflateException: двоичный файл XML: ошибка раздувания фрагмента класса"

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

Таким образом, он должен измениться:

  android:name="com.fragment.NavigationDrawerFragment" 

в

 class = "com.fragment.NavigationDrawerFragment" 

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

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

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

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

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

к этому :

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

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

Возможно, вам это больше не понадобится, но если дальнейшие читатели считают это полезным. У меня есть то же самое android.view.InflateException:...Error inflating class fragment . У меня были все нужные библиотеки. Решено путем добавления еще одного пользовательского разрешения в файле AndroidManifest.xml т.е. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

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

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

Таким образом, в XML-операции я имел:

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

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

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

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

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

 import android.support.v4.app.Fragment; 

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

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

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

У меня также был этот вопрос. Я решил это, заменив импорт в 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(); } 

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

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

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

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

Например: public class CustomTextView extends TextView {}

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

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

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

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

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

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


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

Но это всего лишь детали. Проблема большого изображения заключается в том, что сообщение об ошибке, появившееся в logcat, не описывает исключение, которое запустило все это. Когда onCreateView() более высокого уровня ссылается на фрагмент, onCreateView() фрагмента. Когда возникает исключение в onCreateView() (например, при раздувании XML-фрагмента фрагмента), это приводит к 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() этого класса, и в этом случае сделать это с каждым классом фрагмента, который используется в макете, вызвавшем эту проблему. Например, в случае OP код приложения, в котором произошло исключение, был

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

который

  setContentView(R.layout.activity_main); 

Таким образом, вам нужно поймать исключения в onCreateView() любых фрагментов, на которые ссылается макет 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() ваших фрагментов. Если в нем есть неперехваченное исключение, это приведет к сбою активности независимо. Единственное различие заключается в том, что если вы поймаете и onCreateView() исключение в onCreateView() , вы не будете в неведении относительно того, почему это произошло.

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

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

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

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

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

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

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

Вот как я начал транзакцию фрагмента:

  youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_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; } 

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

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

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

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

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

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

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

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

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

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

android:targetSdkVersion=16

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

android:targetSdkVersion=22

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

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

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

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

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

Когда все, что мне нужно было сделать, это использовать v в «View», чтобы система переделала его. Убедитесь, что ваши пользовательские представления (или фрагменты, 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 исправит это и правильно покажет его как ошибку.

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

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

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

 android:name="com.fragment.NavigationDrawerFragment" 

в

 class = "com.fragment.NavigationDrawerFragment" 

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

 class = "NavigationDrawerFragment" 

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

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

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

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

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

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

Я передавал пакет из Activity в его фрагмент. Когда я прокомментировал код, получающий пакет в фрагменте, ошибка исчезла. Как оказалось, моя ошибка была вызвана ниже: «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(); 

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

 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, но это решило мою ошибку, если кто-то имеет тот же сценарий