【问题标题】:How can I reference a drawable class in Android XML如何在 Android XML 中引用可绘制类
【发布时间】:2015-05-27 00:43:35
【问题描述】:

我创建了一个扩展可绘制对象的类,我想在资源 xml 中引用它。我碰巧在选择器中需要它,如下所示:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_pressed="false" 
android:drawable="com.sample.android.contacts.TopBarCollapsed"
/>
<item android:state_window_focused="true" android:state_pressed="true" android:drawable="@drawable/top_switcher_collapsed_selected" />
<item android:state_focused="true" android:drawable="@drawable/top_switcher_collapsed_focused" />

com.sample.android.contacts.TopBarCollapsed 是扩展 drawable 的类。

【问题讨论】:

  • 仍在搜索这个 - 找到了这个注释 groups.google.com/group/android-developers/browse_thread/thread/…,我读到它说这是不可能的。
  • 我发现了另一个讨论线程(丢失了 URL),据说出于安全考虑,不允许在 XML 标记中使用任意可绘制类。这是有道理的:为一个无害的应用程序提供一个“恶意的 Drawable”相对容易,并且该 drawable 的代码将在无辜的应用程序的上下文中执行。

标签: android


【解决方案1】:

我相信这个问题在这里得到了很好的回答:https://stackoverflow.com/a/11024035/2662474

很遗憾,由于潜在的安全问题,无法在 XML 文件中使用自定义可绘制对象。请参阅 here 以获取有关此主题的 Google 网上论坛帖子以及来自 Android 开发人员之一 Romain Guy 的回复。

您仍然可以在 Java 代码中使用它们。

Roman 在该链接中写道:

XML 中不允许自定义可绘制对象,主要是出于安全原因。 XML drawable 可以作为资源被其他进程(包括 Launcher 或系统进程)加载,在这些进程中运行随机的 3rd 方代码是一个糟糕的主意。

安全性是必不可少的,但如果有一种干净的方法可以让开发人员获得更高的一致性和控制力,那当然会很好。

【讨论】:

    【解决方案2】:

    对于资源 xml 中的自定义视图类,请查看此示例:

    http://developer.android.com/guide/topics/ui/custom-components.html#modifying

    不确定这是否适用于扩展 Drawable 的类,但值得一试……另一件事,我一直在底部缺少此注释,用于在自己的类文件中定义的类:

    如果您的自定义 View 组件未定义为内部类,那么您也可以使用 XML 元素名称声明 View 组件,并排除 class 属性。例如:

    <com.android.notepad.MyEditText
     id="@+id/note"
     ... />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多