【发布时间】:2014-11-06 08:26:02
【问题描述】:
注意:实际问题在What my questions are 部分。提供其他部分是为了更好地了解问题。
任务
我想使用Decorator design pattern 来装饰Android 视图。对于我的问题,我将以装饰ViewPager 为例,但我相信解决方案会更通用。
我为什么需要它
我希望能够在我的不同解决方案中对标准视图重复使用不同的增强功能。例如。现在我有定时器切换ViewPager 和ViewPager,当用户到达终点时通知我。有了这个解决方案,我的目标是在我的下一个解决方案中添加自动切换通知ViewPager(即结合我当前的扩展)。装饰器模式正是为此而生的。
我目前的方法是什么
- 我已经将目标
ViewPager包裹在ViewPagerDecorator中 -
我还对装饰器进行了所需的扩展 -
AutoSwitchViewPager和NotifyOutOfBoundsViewPager(基于 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