在运行时膨胀类 ImageButton 时出错,但 Android Studio 没有显示任何错误并且编译完美



应用程序崩溃,出现以下异常:

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_24dpid

文件是如何在我不知情的情况下进入错误的目录的?
我从另一个项目复制了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处理它。

相关内容

最新更新