【问题标题】:How to make the android LayoutInflater use my Custom Resources如何让 android LayoutInflater 使用我的自定义资源
【发布时间】:2014-04-24 15:02:24
【问题描述】:

我已经定义了一个自定义类:

public class CustomResource extends Resources {}

为了在运行时加载自定义外部颜色。使用 getResources().getColor() 时,这在 Java 代码中运行良好。

当通过 setContentView() 加载包含颜色引用的 XML 布局时,在扩展 XML 资源时永远不会调用 CustomResources 的 getColor()

我已经在上下文中覆盖了 getResourcesgetSystemService,但是 getResources().getColor() 在解析 XML 属性时根本不会被 View 构造函数调用。

这是因为 Resource.Theme 中的 obtainStyledAttributes() 是从 Widget 的构造函数中调用的。

我现在不知道我还需要覆盖什么。

示例:layout.xml 包含对 drawable/button.xml 的引用,button.xml 包含对 colors/somecolor 的引用。

我现在需要来自 - 例如 - 一个 TextView 构造函数的调用(充气器通过调用带有 xml 属性作为参数的构造函数来创建一个 TextView)然后调用 obtainStyledAttributes() 来使用我的资源类来解析颜色而不是比目前在obtainStyledAttributes() 中发生的TypedArray 魔法。

【问题讨论】:

  • 在创建 LayoutInflater 时使用什么?
  • 我自己不创建它,例如,我在 Activity 中使用 setContentView()。布局当然是编译到应用程序中的。但我希望我的 Resources 类被 setContentView 后面的任何 Inflaters 使用。但是调用/创建自己的 LayoutInflater 也可以。我只是找不到任何示例来代替 setContentView。
  • 所以扩展 LayoutInflater 并将覆盖 getResources 的自定义上下文传递给 ctor,或者更好地将其传递给静态“from()”方法
  • 根据stackoverflow.com/a/33693516/332798这是不可能的

标签: java android android-resources layout-inflater


【解决方案1】:

【讨论】:

  • 谢谢,但我想我不明白。当我打电话给createContextWrapper() 时,我得到了一个 Wrapper,但是如何处理它呢?
  • 这样使用。 setContentView(LayoutInflater.from(createContextWrapper(xyz)).inflate(R.layout.your_layout, null, false));
  • 啊,谢谢,那是缺失的部分,明白了。所以我可以在已经覆盖getResources() 的活动中使用LayoutInflater.from(this).inflate(),对吗?
  • 好吧,这不起作用:现在我的自定义资源得到了所有解析系统颜色的调用,但没有调用我自己的颜色。似乎充气机甚至懒得为应用程序colors.xml中定义的颜色调用getResources()。我不明白为什么......
  • 您是否创建了一个覆盖了 getResources() 的 ContextWrapper?检查上述代码的第 128 行。您可能想尝试在您的活动中覆盖 getSystemService,例如我的示例中的 150。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
相关资源
最近更新 更多