如何为Android视图实现Decorator模式

Bor*_*jev 6 android design-patterns decorator android-custom-view

注意:实际问题在本What my questions are节中.提供其他部分是为了更好地概述问题.

任务

我想使用Decorator设计模式来装饰Android视图.对于我的问题,我将以装饰ViewPager为例,但我相信解决方案会更加通用.

我为什么需要它

我希望能够在我的不同解决方案中对标准视图重用不同的扩充.例如,现在我有定时器切换ViewPager,ViewPager当用户到达终点时通知我.通过这个解决方案,我的目标是ViewPager在我的下一个解决方案中添加自动切换通知(即将我当前的扩展名组合在一起).装饰者模式正是为此而已.

我目前的方法是什么

  • 我已经做完了有针对性ViewPagerViewPagerDecorator
  • 我也做了装饰器的所需扩展 - AutoSwitchViewPagerNotifyOutOfBoundsViewPager(基于).现在我甚至可以做到

    new AutoSwitchViewPager(new NotifyOutOfBoundsViewPager(viewPager)).

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

我的问题是什么

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

我读了什么

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

  • 装饰Android视图 - 这并不是完全装饰视图,因为装饰器不会订阅视图的不同事件.装饰需要通过特殊的触发方法触发.然而,我所瞄准的装饰确实需要充当装饰类的完整扩展.
  • 装饰模式Android - 这里的装饰再次通过特殊方法触发
  • 装饰一个Android活动 - 我对ComonsWare的所有尊重,我离他的陈述很远.另一方面,我相信Android中的视图允许您比活动更多的运行时修改,所以我的情况仍然是合理的.

Bor*_*jev 6

经过数周的努力并采用了几种不同的设计方法,我认为我终于得到了解决方案!由于解决方案不容易解释为适合SO帖子我创建了一篇博客文章来解释我所有的挣扎.我也陪我的解释与源代码,演示可我的想法在这里.

  • 嗨@BorisStrandjev我知道这是一个老问题,你可能已经开始了,但我偶然发现了你的问题,并想表明我的团队开发了一个基于注释的java代码生成库来删除应用装饰器的样板图案.如果您有兴趣,请查看https://github.com/eyeem/decorator (2认同)