У меня очень расстраивающая ошибка, которую я не могу объяснить. Я создал приложение для 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. Это замечает эту ошибку:
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:id
вclass
) работал для меня. Я также получил предупреждение Lint для измененияFragment
кfragment
, что я и сделал.name
наclass
, у меня было несколько пользователей, сообщающих об этом сбое, но я не могу сам его воспроизвести!Я не мог решить свою проблему, используя предоставленные ответы. Наконец я изменил это:
к этому :
,
и это работает.
Если вы используете его внутри фрагмента, используйте getChildFragmentManager вместо getSupportFragmentManager .
источник
TL / DR : во время создания фрагмента, на который ссылается XML-макет верхнего уровня, возникла исключительная ситуация. Это исключение вызвало сбой инфляции верхнего уровня, но первоначальное исключение не сообщалось ; только ошибка инфляции более высокого уровня обнаруживается в следе стека. Чтобы найти основную причину, вы должны поймать и зарегистрировать первоначальное исключение .
Первоначальной причиной ошибки может быть большое разнообразие вещей, поэтому здесь так много разных ответов относительно того, что решило проблему для каждого человека. Для некоторых это было связано с
id
,class
илиname
атрибутов. Для других это было связано с проблемой прав доступа или настройкой сборки. Для меня это не решило проблему; вместо этого был доступный ресурс, который существовал только вdrawable-ldrtl-xhdpi
, а не в соответствующем месте, какdrawable
.Но это только детали. Проблема в общем состоит в том, что сообщение об ошибке, которое появляется в logcat, не описывает исключение, которое запустило все это. Когда XML макета верхнего уровня ссылается на фрагмент,
onCreateView()
вызывается фрагмент . Когда во фрагменте возникает исключениеonCreateView()
(например, при раздувании XML-макета фрагмента), это приводит к сбою инфляции XML-макета верхнего уровня. Этот сбой инфляции более высокого уровня - то, что регистрируется как исключение в журналах ошибок. Но первоначальное исключение, кажется, не продвигается по цепочке достаточно хорошо, чтобы о нем сообщать.Учитывая эту ситуацию, вопрос заключается в том, как отобразить исходное исключение, когда оно не отображается в журнале ошибок.
Решение довольно простое: поместите блок
try
/catch
вокруг содержимого фрагментаonCreateView()
, а вcatch
предложении запишите исключение:Может не быть очевидным, к какому классу фрагментов это
onCreateView()
нужно делать, и в этом случае делать это с каждым классом фрагментов, который используется в макете, вызвавшем проблему. Например, в случае OP код приложения, где произошло исключение, былкоторый
Поэтому вам нужно отлавливать исключения
onCreateView()
из любых фрагментов, на которые есть ссылки в макетеactivity_main
.В моем случае исключение первопричины оказалось
Это исключение не появилось в журнале ошибок, пока я не поймал его
onCreateView()
и не зарегистрировал его явно. После регистрации проблема стала достаточно легкой для диагностики и устранения ( почему-тоdetails_view.xml
существовала только вldrtl-xhdpi
папке). Ключ был в том, чтобы поймать исключение, которое было причиной проблемы, и выявить его.Это не повредит сделать это как образец для всех
onCreateView()
методов ваших фрагментов . Если там есть необработанное исключение, это приведет к аварийному завершению операции. Разница лишь в том, что если вы поймаете и зарегистрируете исключениеonCreateView()
, вы не будете знать, почему это произошло.PS Я только что понял, что этот ответ связан с @ DaveHubbard, но использует другой подход для поиска основной причины (логирование или отладчик).
источник
У меня была такая же проблема, проблема, перепробовал все ответы в этой теме безрезультатно. Мое решение было, я не добавил идентификатор в XML деятельности. Я не думал, что это будет иметь значение, но это имело значение.
Итак, в Activity XML я имел:
Но должен был иметь:
Если кто-то с радостью прокомментирует, почему это так, я весь слух другим, надеюсь, это поможет.
источник
Возможно, он вам больше не нужен, но если другие читатели сочтут это полезным. У меня точно такой же
android.view.InflateException:...Error inflating class fragment
. У меня были все нужные библиотеки включены. Решается добавлением еще одного пользовательского разрешения вAndroidManifest.xml
файл, т.е.<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Кстати, я бежал
Android Studio 0.8.9 on Ubuntu 12.04.
источник
У меня та же проблема, потому что я не реализовал слушателя. Смотрите следующий код с
/*Add This!*/
.К вашему сведению, мой класс фрагментов выглядит примерно так:
Редактировать:
Я также замечаю то же самое сообщение об ошибке при других обстоятельствах, когда есть исключение в
onCreate
функцииFragment
. У меня есть что-то вроде следующего:Поскольку я повторно использую этот фрагмент, я полностью забываю установить аргументы. Тогда результат
getArguments()
естьnull
. Очевидно, я получаюnull
исключение указателя здесь. Я предлагаю вам также следить за такими ошибками.источник
Ваш NavigationDrawerFragment расширяет фрагмент android.support.v4.app.Fragment? Другими словами, вы импортируете правильный пакет?
источник
У меня тоже была эта проблема. Я решил это, заменив импорт в
MainActivity
иNavigationDrawerFragment
Из
к
Я обновил,
MainActivity
чтобы расширяетActionBarActivity
вместо активностиТакже используйте,
ActionBar actionBar = getSupportActionBar();
чтобы получить ActionBarИ я обновил следующую функцию в
NavigationDrawerFragment
источник
Я столкнулся с этой проблемой и решил ее с помощью следующих кодов. Я начинал транзакцию фрагмента с помощью менеджера дочерних фрагментов.
расположение:
вот как я начал фрагмент транзакции:
следующие коды объясняют, как я удалил фрагмент, который был добавлен с помощью childfragmentmanger.
источник
У меня были похожие проблемы вкл и выкл. Сообщение об ошибке часто содержит очень мало деталей, независимо от фактической причины. Но я нашел способ получить более полезную информацию. Оказывается, что внутренний класс android «LayoutInflater.java» (в пакете android.view) имеет метод «inflate», который повторно генерирует исключение, но не собирает детали, поэтому вы теряете информацию о причине.
Я использовал AndroidStudio и установил точку останова в строке 539 LayoutInflator (в версии, в которой я работаю), которая является первой строкой блока catch для общего исключения в этом методе «inflate»:
Если вы посмотрите на «e» в отладчике, вы увидите поле «причина». Это может быть очень полезно, давая вам подсказку о том, что действительно произошло. Так, например, я обнаружил, что родительский фрагмент включенного фрагмента должен иметь идентификатор, даже если он не используется в вашем коде. Или что у TextView была проблема с измерением.
источник
На всякий случай, если это кому-то нужно. Допущения: телефон устройства подключен к USB-кабелю и ваше чтение IDE для запуска приложения. Перейдите в командную строку, чтобы определить проблему: введите adb logcat
Затем запустите свое приложение из IDE. Вы будете исключением.
В моем случае: я развертывал приложение Android версии 2.3 на мобильное устройство, которое не поддерживало виджет «Космос».
источник
Эта проблема возникает, когда у вас есть пользовательский класс, который расширяет другой класс (в данном случае представление) и не импортирует все конструкторы, требуемые классом.
Например: открытый класс CustomTextView расширяет TextView {}
Этот класс будет иметь 4 конструктора, и если вы пропустите один из них, он потерпит крах. На самом деле я пропустил последний, который использовал Lollipop, добавил этот конструктор и работал нормально.
источник
мы также должны добавить следующее в build.gradle (приложение)
всякий раз, когда мы используем новые макеты или новые конструктивные особенности. надеюсь, это поможет вам.
источник
Как уже упоминалось в предыдущем посте,
переименуйте
в
Тем не менее, это не сработало для меня. Затем я просто использовал имя класса без части com.fragment и вуаля это сработало. Так что измените это наконец
источник
После того, как ни один из ответов здесь не помог мне, я решил запустить приложение в режиме отладки, перемещаясь по каждой строке onCreateView в моем фрагменте (NavigationDrawerFragment в вашем случае). И заметил, что у фрагмента были проблемы с надуванием из-за исключения NullPointerException. Например
Здесь mySeekBar был установлен в null (потому что я пропустил добавление элемента управления в соответствующем макете), и следующая строка попала в NPE, которая появилась как InflateException. Также, как предложено выше, переименуйте Android: имя в класс.
Эта проблема может возникнуть по разным причинам, указанным выше. Я бы порекомендовал построчную отладку, чтобы узнать, что не так.
источник
onCreateView()
методе фрагмента ?Для некоторых из вас, которые до сих пор не нашли решения для этого, в моем случае это происходило из-за проблемы с OOM (Out of Memory). Это может произойти, если у вас, например, есть утечка памяти в приложении при длительном использовании. В моей трассировке стека это было главной причиной.
источник
Я не знаю, поможет ли это.
У меня была эта проблема с TextView, который у меня был в макете, который я пытался надуть ( android.view.InflateException: строка двоичного XML-файла # 45: Ошибка надувания класса TextView ).
Я установил следующий атрибут XML android: textSize = "? Android: attr / textAppearanceLarge", который не позволял раздувать макет.
Не знаю точно, почему, ( я все еще немного новичок в Android - менее года опыта ), может иметь какое-то отношение к вызову системных атрибутов, idk, все, что я знаю, это как только я использовал обычный старый @ измерение / md_text_16sp ( который является моим обычаем ), проблема решена :)
Надеюсь это поможет...
источник
Widget.Design.TextInputLayout
:. stackoverflow.com/questions/19874882/…У меня было это на устройстве 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 исправит это и правильно покажет это как ошибку.Надеюсь, это кому-нибудь поможет.
источник
Я немного опоздал на вечеринку, но ни один из этих ответов не помог мне в моем случае. Я использовал карту Google в качестве SupportMapFragment и PlaceAutocompleteFragment в моем фрагменте. Поскольку все ответы указывают на тот факт, что проблема в том, что SupportMapFragment является картой, которая должна быть воссоздана и перерисована.
Но у меня также была проблема с PlaceAutocompleteFragment. Итак, вот рабочее решение для тех, кто сталкивается с этой проблемой из-за SupportMapFragment и SupportMapFragment
И в onDestroyView очистите SupportMapFragment и SupportMapFragment
источник
После долгих попыток я решил проблему так, как не смог ответить ни один из приведенных выше ответов.
AppCompatActivity
своюMain
деятельность вместоActivity
.android:theme="@style/Theme.AppCompat.Light"
к вашему<Activity..../>
вAndroidManifest.xml
В своем
NavigationDrawerFragment
классе измените своиActionBar
экземпляры наРЕДАКТИРОВАТЬ
Это должно быть соответствие между деятельностью и макетом . Если макет имеет одну из тем AppCompat , например
Theme.AppCompat.Light
, ваша активность должнаextends AppCompatActivity
.Я хотел иметь значок гамбургера и навигационный ящик, который выглядит как приложение Android Gmail , но в итоге я получил уродливый навигационный ящик . Все это потому, что все мои классы
extends Activity
вместоAppCompatActivity
.Я пересмотрел весь проект, чтобы расширить его
AppCompatActivity
, затем щелкнуть правой кнопкой мышиLayout Folder
, выбратьnew
->Activity
затемNavigation Drawer Activity
и Boom, все для меня сделано!источник
Представление может быть чем угодно, что не может быть раздутым, такая ошибка возникает, когда возникает конфликт в разрешении имен классов или атрибута имени представления, указанного в файле XML.
Когда я получаю ту же ошибку, я просто получил все чистое и безопасное в файле UI-XML, представление, которое я использовал,
Я использовал атрибут стиля, который ссылался на свойство компонентов материала. Но мой файл styles.xml ...
Где класс решал столкновение с конфликтом. Мои атрибуты просмотра ссылались на свойство, которое не было определено в теме моего приложения. Правильная родительская тема из материальных компонентов помогла мне. Поэтому я изменил родительский атрибут на ...
Который решил проблему.
источник
Я думаю, что основная проблема связана с «android: targetSdkVersion», который определен в AndroidManifest.xml. В моем случае начальное значение, которое я определил как:
android:targetSdkVersion=16
Я изменил это на:
android:targetSdkVersion=22
что решило все мои ошибки. Таким образом, установка правильного «targetSdkVersion» также важна перед созданием приложения для Android.
источник
В случае, если кто-то еще приходит сюда и ответы не помогают решить проблему, нужно попробовать еще одну вещь.
Как уже упоминали другие, это обычно вызвано проблемой, вложенной в сам XML, а не тем, что вы сделали неправильно в вашей Java. В моем случае это было очень легко (и глупо) исправить.
У меня был такой код:
Когда все, что мне нужно было сделать, это сделать прописными букву v в «View», чтобы система распознала его. Убедитесь, что все ваши пользовательские представления (или фрагменты, виды повторного использования и т. Д.) Имеют правильную заглавную декларацию, чтобы автозаполнение XML соответствовало соответствующему представлению.
источник
У меня тоже была эта ошибка, и после очень долгой отладки проблема выглядела так, что мой MainClass расширил Activity вместо FrameActivity, в моем случае xml не был проблемой. Надеюсь помочь вам.
источник
В моем случае .
План, который я пытался надуть, имел
тег, удалив это исправил это.
Я пытался надуть предыдущий макет, разработанный для Actvity, в адаптер пейджера.
источник
Моя ошибка была вызвана другой проблемой.
Я передавал связку из Деятельности в ее фрагмент. Когда я прокомментировал код, получающий пакет во фрагменте, ошибка исчезла. Как оказалось, моя ошибка была из-за нижеприведенного "getArguments ();" часть, которая возвращала ноль.
После проверки кода отправки Activity я понял, что допустил глупую ошибку в следующем;
Я создавал новый фрагмент в строке со стрелкой. Принимая во внимание, что я должен был использовать предварительно созданный фрагмент, который уже имел мою связку. Так и должно было быть:
Я не знаю, почему именно он выдает эту ошибку вместо NPE, но это решило мою ошибку в случае, если у кого-то такой же сценарий
источник
У меня была такая же проблема, в моем случае имя пакета было неправильным, исправление решило проблему.
источник
Откройте файл gradle.properties и добавьте следующую строку:
Ссылка: https://github.com/chrisjenx/Calligraphy/issues/417#issuecomment-365177808
источник
У меня была эта ошибка, когда у меня был RecyclerView в корне моего фрагмента. Xml,
но когда я обернул его с помощью ViewGroup, приложение работало нормально.
источник
Добавьте это поле имени в навигацию
источник