我正在努力在Xamarin.Android中使用旧的Android版本(API 16)上的(基于XML的)矢量绘图创建启动画面。我已经阅读了很多类似的问题,但无论我尝试什么,我都无法工作。
我目前有以下内容,适用于最近的Android版本(例如API 25):
抽拉/ itlogotext.xml:
<vector xmlns:android="http://schemas.android.com/apk/res/android" [...]>
[...]
</vector>
抽拉/ 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>
值/ 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
。从<item>
删除带有drawable的splash_screen.xml
可以修复崩溃,但当然在启动画面中没有徽标。
我也尝试在构造函数,静态构造函数和AppCompatDelegate.CompatVectorFromResourcesEnabled = true
中添加OnCreate
,但无论我把它放在哪里,结果都是根本没有显示启动画面(即Android应用程序)在显示应用程序的主屏幕之前,抽屉是可见的。
如何在启动画面上使用XML矢量绘图来处理早期的Android版本?
答案 0 :(得分:0)
你可以参考:
https://bugzilla.xamarin.com/show_bug.cgi?id=41489
正如@Jon Dick所说,它应该在&lt; 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设备版本低于&lt;时,您可以将图片用作背景21.
在values-21
文件夹中创建Resource
文件夹,创建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
个文件。