应用程序崩溃,出现以下异常:
android.view.InflateException: Binary XML file line #185: Binary XML file line #15: Error inflating class ImageButton
但是Android Studio没有显示布局错误,导致崩溃的文件的布局预览已正确呈现,并且可以编译和运行应用程序。
崩溃ImageButton
:
<ImageButton
android:id="@+id/kasablok_pager_btn_left"
android:layout_width="74dp"
android:layout_height="match_parent"
android:background="#FFFFFF"
app:srcCompat="@drawable/ic_chevron_right_black_24dp"
android:rotation="180"
tools:ignore="ContentDescription" />
源可绘制对象存在,并且可单击到文件。预览窗口中没有错误或警告来指示可能存在的问题。vectorDrawables.useSupportLibrary = true
在我的build.gradle
文件中也正确设置。
答:ic_chevron_right_black_24dp.xml
文件位于特定的res/drawable-v24
文件夹中,而不是公共res/drawable
。这样,id
仅在 API 24+ 上可用。将文件移动到后一个文件夹中确实解决了问题。我的手机运行AndroidM(API 23(,这就是它崩溃的原因。找不到ic_chevron_right_black_24dp
id
。
文件是如何在我不知情的情况下进入错误的目录的?
我从另一个项目复制了ic_chevron_right_black_24dp.xml
文件。我所做的是将文件粘贴到drawable
资源目录中,同时以Android
方式查看项目(左上角的下拉列表允许您选择如何在左侧导航面板中表示项目(。Android工作室不知何故决定将文件放入特定drawable-v24
而不是常规drawable
文件夹中。
为什么Android Studio没有显示任何错误,为什么预览被适当地夸大了?
布局预览已正确膨胀,因为预览和compileSdkVersion
都设置为android-P
。这样,预览就呈现为android-P
资源所在的 API 上一样。
如何解决应用程序中的InflateException
?
当您看到InflateException
时,此异常本身不会提供有关您的问题的任何可用信息。它可以由各种不同的独立事物引起。你必须看得更深。InflateException
不是原因——它是由其他事情引起的结果。
在我的例子中,整个堆栈跟踪如下所示:
android.view.InflateException: Binary XML file line #185: Binary XML file line #15: Error inflating class ImageButton
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2335)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1423)
.....
Caused by: android.view.InflateException: Binary XML file line #15: Error inflating class ImageButton
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
.....
Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f070070
at android.content.res.Resources.getValue(Resources.java:1364)
at android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates(AppCompatDrawableManager.java:328)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:193)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:186)
at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100)
at android.support.v7.widget.AppCompatImageHelper.loadFromAttributes(AppCompatImageHelper.java:58)
at android.support.v7.widget.AppCompatImageButton.<init>(AppCompatImageButton.java:78)
at android.support.v7.widget.AppCompatImageButton.<init>(AppCompatImageButton.java:68)
at android.support.v7.app.AppCompatViewInflater.createImageButton(AppCompatViewInflater.java:201)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:121)
这样更有用。痕迹显示,InflateException
是由Resources$NotFoundException
触发的,这才是真正的罪魁祸首。
我解决了这个错误,将文件(Image(从/res/drawable-v24
移动到常规文件夹/res/drawable
,这是任何版本的文件夹,并在布局代码XML中app:src
处理它。