![](/img/trans.png)
[英]Android.Content.Res.Resources+NotFoundException Drawable com.companyname.mySchool:drawable/splash_screen with resource ID #0x7f02012c
[英]Vector (XML) drawable on splash screen on old Android versions
我正在努力在Xamarin.Android的旧Android版本(API 16)上使用(基于XML的)矢量可绘制对象创建启动画面。 我已经读过很多类似的问题,但是无论尝试如何,我都无法使它正常工作。
我目前有以下功能,在最新的Android版本(例如API 25)上可以正常使用:
drawable / itlogotext.xml:
<vector xmlns:android="http://schemas.android.com/apk/res/android" [...]>
[...]
</vector>
drawable / splash_screen.xml:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<color android:color="#3498DB" />
</item>
<item
android:drawable="@drawable/itlogotext"
android:gravity="center" />
</layer-list>
values / styles.xml:
<resources>
[...]
<style name="MyTheme.Splash" parent ="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_screen</item>
<item name="colorPrimaryDark">#1B6698</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
SplashActivity.cs:
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Support.V7.App;
using JetBrains.Annotations;
[Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
ScreenOrientation = ScreenOrientation.Portrait)]
public sealed class SplashActivity : AppCompatActivity
{
protected override void OnResume()
{
base.OnResume();
this.StartActivity(new Intent(Application.Context, typeof(MainActivity)));
}
}
我拥有最新的支持库(26.1.0.1,包括Xamarin.Android.Support.v4和Xamarin.Android.Support.v7.AppCompat,后者取决于Xamarin.Android.Support.Vector.Drawable)。
不幸的是,当我尝试在旧的Android版本(例如API 16)上运行该应用程序时,我只是简单地遇到一个异常,说android.content.res.Resources$NotFoundException: File res/drawable/splash_screen.xml from drawable resource ID #0x7f020125
,此行位于跟踪的底部: Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #1: invalid drawable tag vector
。 从splash_screen.xml
使用drawable删除<item>
可以解决崩溃问题,但是初始屏幕中当然没有徽标了。
我还尝试在构造函数,静态构造函数和OnCreate
添加AppCompatDelegate.CompatVectorFromResourcesEnabled = true
,但是无论我放在哪里,结果都是根本不会显示启动屏幕(即,直到应用程序主界面可见的Android应用程序抽屉屏幕显示)。
如何在初始屏幕上获取XML矢量可绘制对象以在早期的Android版本上工作?
您可以参考:
https://bugzilla.xamarin.com/show_bug.cgi?id=41489
正如@Jon Dick所说,它应该在<API级别19中失败。在API级别21中,向Android添加了矢量支持,因此它可以在API级别21+上工作,而无需进行任何更改,因为支持库将仅切换到本机实现。在那时候。
这是一个解决方案:定制一个Android
Application
,添加AppCompatDelegate.CompatVectorFromResourcesEnabled = true
像这样:
[Application]
public class MainApplication : Application
{
public static Context AppContext;
public MainApplication()
{
}
public MainApplication(IntPtr handle, JniHandleOwnership transer) : base(handle, transer)
{
}
public override void OnCreate()
{
base.OnCreate();
AppCompatDelegate.CompatVectorFromResourcesEnabled = true;
}
}
当Android设备版本小于21时,您可以将图片用作背景。
在Resource
文件夹中创建一个values-21
文件夹,创建一个styles.xml
:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<!--
Base application theme for API 21+. This theme completely replaces
MyTheme.Splash from BOTH res/values/styles.xml on API 21+ devices.
-->
<style name="MyTheme.Splash" parent ="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_screen</item>
<item name="colorPrimaryDark">#1B6698</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
Resource/values-v21/
目录包含运行应用程序的设备处于API级别21或更高级别时将使用的资源。 如果设备在旧版Android上运行,则Resource/values-v21/
目录将被忽略。
在您的Reources\\values\\styles.xml
,修改MyTheme.Splash
的windowNoTitle
有不同的背景。
Reources \\ values \\ styles.xml:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<style name="MyTheme.Splash" parent ="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_screen_low_version</item>
<item name="colorPrimaryDark">#1B6698</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
splash_screen_low_version.xml:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item>
<color android:color="#3498DB" />
</item>
<item
android:drawable="@drawable/yourlogo"
android:gravity="center"/>
</layer-list>
请注意, yourlogo是.png
文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.