如何在 .NET Android 中使用 XmlReader 从 XML 字符串创建 IAttributeSet?

问题描述 投票:0回答:1

我正在尝试在 Android .NET 中使用 ExoPlayer 构造函数,它需要 IAttributeSet 来根据这个问题设置一些参数。

我正在尝试解决 IAttributeSet 的创建问题,但似乎无法成功。

在 Visual Studio 2022 中,如果出现:

  1. 文件 > 新建 > Android 应用程序
  2. 添加 ExoPlayer NuGet
    Xam.Plugins.Android.ExoPlayer
  3. 然后在MainActivity.cs中,可以尝试以下代码:
protected override void OnCreate(Bundle? savedInstanceState) {
    base.OnCreate(savedInstanceState);
    
    string xmlString =
        "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
        "<Com.Google.Android.Exoplayer2.UI.PlayerView " +           
        "android:id=\"@+id/player_view\" " +
        "app:surface_type=\"texture_view\" " + //KEY NEEDED LINE FOR GOAL
        "android:layout_width=\"match_parent\" " +
        "android:layout_height=\"match_parent\"/>";
    
    XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString));
    System.Diagnostics.Debug.WriteLine("XML READER " + xmlReader.AttributeCount);
            
    Android.Util.IAttributeSet attributes = Android.Util.Xml.AsAttributeSet(xmlReader);
    System.Diagnostics.Debug.WriteLine("ATTRIBUTES " + attributes.AttributeCount);
    
    Com.Google.Android.Exoplayer2.UI.StyledPlayerView styledPlayerView = new(this, attributes);            

Visual Studio 中编码时没有给出任何错误。然而,运行它时有两个明显的问题:

  1. xmlReader.AttributeCount
    attributes.AttributeCount
    都返回为
    0
    ,我认为这意味着他们没有正确设置任何 XML。
  2. ExoPlayer 构造函数行返回错误
    **Java.Lang.ClassCastException:** 'android.util.XmlPullAttributes cannot be cast to android.content.res.XmlBlock$Parser'

为什么这段代码在这两点上失败了?我看到 (2) 中的错误的唯一其他地方是here,我不确定这是如何工作的。

如何创建 ExoPlayer 构造函数所需的 IAttributeSet?

感谢您的帮助。

c# android .net attributes exoplayer
1个回答
0
投票

这是有效的 Kotlin 代码。我希望它能帮助你。 我看到的差异:

  1. XML 中的命名空间:
    xmlns:app
  2. 将解析器移至第一个标签。

XML:

<?xml version="1.0" encoding="utf-8"?>
<androidx.media3.ui.PlayerView xmlns:app="http://schemas.android.com/apk/res-auto"
    app:surface_type="texture_view" />

解析:

fun getPlayerViewAttributes(context: Context): AttributeSet {
    val parser = context.resources.getXml(R.xml.exoplayer)
    var type = 0
    while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) {
        type = parser.next()
    }
    return Xml.asAttributeSet(parser)
}
© www.soinside.com 2019 - 2024. All rights reserved.