繁体   English   中英

在旧版Android的启动画面上可绘制的矢量(XML)

[英]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时,您可以将图片用作背景。

第1步 :

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

第2步 :

在您的Reources\\values\\styles.xml ,修改MyTheme.SplashwindowNoTitle有不同的背景。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM