【问题标题】:How to implement Decorator pattern for Android views如何为 Android 视图实现装饰器模式
【发布时间】:2014-11-06 08:26:02
【问题描述】:

注意:实际问题在What my questions are 部分。提供其他部分是为了更好地了解问题。

任务

我想使用Decorator design pattern 来装饰Android 视图。对于我的问题,我将以装饰ViewPager 为例,但我相信解决方案会更通用。

我为什么需要它

我希望能够在我的不同解决方案中对标准视图重复使用不同的增强功能。例如。现在我有定时器切换ViewPagerViewPager,当用户到达终点时通知我。有了这个解决方案,我的目标是在我的下一个解决方案中添加自动切换通知ViewPager(即结合我当前的扩展)。装饰器模式正是为此而生的。

我目前的方法是什么

  • 我已经将目标ViewPager 包裹在ViewPagerDecorator
  • 我还对装饰器进行了所需的扩展 - AutoSwitchViewPagerNotifyOutOfBoundsViewPager(基于 this)。现在我什至可以做

    new AutoSwitchViewPager(new NotifyOutOfBoundsViewPager(viewPager)).

  • 现在我试图弄清楚如何将这个运行时创建的视图放置在布局中。我目前正在尝试弄清楚是否可以从将其 xml 属性传播到装饰视图的布局中替换普通的 ViewPager

我的问题是什么

  • 有没有办法将 xml 属性从布局定义的视图复制到运行时构造的视图(至少LayoutParameters
  • 另一种方法是使用ViewStub,但我没有找到一种方法来使用完全运行时构造的东西(不使用xml 布局)来扩充ViewStub。有没有这样的方法?

我读了些什么

我偶然发现了这些相关资源:

  • Decorating Android views - 这并没有完全装饰视图,因为装饰器不会订阅视图的不同事件。装饰需要通过特殊的触发方法来触发。但是,我所针对的装饰确实需要充当装饰类的完整扩展。
  • Decorator pattern Android - 这里装饰再次通过特殊方法触发
  • Decorating an Android activity - 出于对 ComonsWare 的所有尊重,我离质疑他的声明还差得很远。另一方面,我相信 Android 中的视图允许您进行比活动更多的运行时修改,所以我的情况仍然是合理的。

【问题讨论】:

  • 了解 LayoutImflater.setFactory/LayoutImflater.setFactory2
  • LayoutInflater.Factory2 更好,因为它提供了额外的 View parent 参数,但它需要 API 11+
  • 只是忘了在 Activity 中实现 LayoutInflater.Factory2 时添加,确保调用超级实现
  • @pskink 感谢所有 cmets 我目前正在探索您指出的这种新可能性。谢谢你给我指路!

标签: android design-patterns decorator android-custom-view


【解决方案1】:

经过数周的努力并应用了几种不同的设计方法,我认为我终于找到了解决方案!由于解决方案不像 SO 帖子那样容易解释,我创建了一个 blog post 来解释我所有的挣扎。我的解释还附有源代码,以证明我的想法可用here

【讨论】:

  • 两年后你的解决方案在 Material Design 的 ViewPager 中是否仍然有效?
  • @IgorGanapolsky 如果你问我ViewPager 的新概念是否包含在我提供的源代码中 - 我相信不是。但是,问题和答案的目的也是提供一种通用方法,而不是特定的ViewPager 绑定解决方案,尽管后者用作 POC。
  • 嗨@BorisStrandjev 我知道这是一个老问题,你可能已经继续前进,但我偶然发现了你的问题,并想向我展示我的团队开发了一个基于注释的 java 代码生成库从应用装饰器模式中删除样板。如果您有兴趣,请查看github.com/eyeem/decorator
猜你喜欢
  • 2012-02-16
  • 2020-02-29
  • 2018-12-23
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多