【问题标题】:Vector (XML) drawable on splash screen on old Android versions可在旧 Android 版本的初始屏幕上绘制的矢量 (XML)
【发布时间】:2017-11-08 08:53:54
【问题描述】:

我正在努力在 Xamarin.Android 的旧 Android 版本 (API 16) 上使用(基于 XML 的)矢量绘图创建启动画面。我已经阅读了很多类似的问题,但无论我尝试什么,我都无法让它发挥作用。

我目前有以下,在最近的 Android 版本(例如 API 25)上运行良好:

可绘制/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 中的可绘制对象删除 &lt;item&gt; 可修复崩溃,但当然启动画面中不再有徽标。

我也尝试在构造函数、静态构造函数和OnCreate 中添加AppCompatDelegate.CompatVectorFromResourcesEnabled = true,但无论我把它放在哪里,结果都是启动屏幕根本不显示(即Android 应用程序抽屉直到显示应用程序的主屏幕)。

如何让初始屏幕上的 XML 矢量可绘制对象在早期的 Android 版本上工作?

【问题讨论】:

    标签: c# xamarin.android android-drawable


    【解决方案1】:

    您可以参考:

    https://bugzilla.xamarin.com/show_bug.cgi?id=41489

    正如@Jon Dick 所说,它应该在

    这是一个解决方案:自定义 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设备版本

    第一步:

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

    【讨论】:

    • 正如我在问题中所说,我已经尝试过CompatVectorFromResourcesEnabled,但它不起作用。
    • @cmeeren,当 Android 设备版本为 Vector 作为背景吗?
    • 这就是我目前正在做的,也是我最想改变的。 :-)
    • 不,我仍然没有解决 API
    猜你喜欢
    • 2017-08-10
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多