矢量(XML)可绘制在旧Android版本的初始屏幕上

时间:2017-11-08 08:53:54

标签: c# xamarin.android android-drawable

我正在努力在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版本?

1 个答案:

答案 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.

第1步:

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/目录将被忽略。

第2步:

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个文件。