Download模块 (九)

来源:互联网 发布:a 寻路算法 python 编辑:程序博客网 时间:2024/06/06 01:44
Download模块 (九)

DownloadsFragment类是负责展现当前Download信息的fragment, 按照需要extends FullscreenFragment,
同样遵循惯例,实现了几个Listener 作为 C 的聚合.

<1> DownloadsFragment自身所展示的View比较简单,不过里面有一个container view, 该container view在 onCreateView的时候
会将真正要展示的内容 作为一个 view add进去,但是这样设计是为了实现 view 展示的灵活性,不过后面没有用上这个优势,并且后面
DownloadFragment中的逻辑代码和view引用也和放入到container中的view紧密耦合,已经基本失去了灵活性作用。

<2>为了告知mainActivity DownloadFragment的显示和销毁<让mainActivity检测当前界面是否是DownloadFragment>,对外提供了
一个Listener接口,让listener在DownloadFragment attach/deattach可以得到通知。

<3>当前的DownloadFragment container内有一个viewPager来表示不同的 下载存储方式 ,设计时要求能够记忆用户上次离开时 viewPager
所在Page, 因此除了在settings中永久化当前所在pageid外,还要考虑fragment因为旋转都原因重新构造时 该pageid的保存和重现,
因此还是使用bundle 和 Fragment的 setArgument() savedInstanceState机制来保证这一点,同样,为了构造时就将此参数传入,并且对外界封装如何设置,采用了工厂模式的 newInstance来new fragment 并 setArgument。

<4>DownloadFragment 和 DownloadConfirmFragment的总体界面是比较相似的,但是在code层没有做到重用。因为一些额外功能最终导致逻辑代码分化。

<5>DownloadFragment在attach和detach的时候要register/unregister 自己在mianActivity中的 keyPressProvider中的receiver,因此来响应/取消响应 keyPress。

<6>DownloadFragment也有和DownloadConfirmFragment同样的indicatorView和slideView,其中slideView已经独立出成为一个组件,
不过indicatorView还没有做独立化。有重复的code。

<7>onCreateView所作工作是常规的的inflate,findViewId, 这里还包括了DownloadFragment对内部 viewPager的初始化<设置pagerAdapter
, pageChangeListener(fragment实现了此C)> 和 一个 通过View+Animation 实现的Menu的初始化, 以及可click的view的clickListener设置<fragment实现了此C>.

<8>因为ViewPager的中的View的处理逻辑在provider中,而provider又要监听某些event,在Fragment被destroy以后,应该取消这些监听,
由于provider本身对destroy没有感知能力,因此需要DownloadFragment在onDestroy时通过pageAdapter通知provider。

<9>和DownloadConfirmFragment一样,DownloadFragment实现PageChangeListener的目的也是为了在viewPager发生变化时配合调整viewPager不能操作的sliderView和indicatorView。

<10>DownloadFragment通过KeyPressReceiver可以感知到keyPress,主要接管了两个keyPress:
(1)MENU 会通过Animation展现之前自定义的一个View 来实现menu效果。
(2)BACK 如果当前Menu是可见的,那么隐藏Menu,否则如果当前是InEdit,那么退出InEidit模式,否则就直接
getFragmentManager().popBackStackImmediate();

<11>Menu的实现是通过在container这个FrameLayout中add一个view的效果实现的,
在addView以后<此时是INVISIBLE的>,当需要显示Menu时,会通过自定义的Animation效果来达到Menu弹出的效果
<一个scale + 一个 alpha, AnimationUtils loadAnimation>, Menu 直接 startAnimation(),会为Animation添加一个Listener,在
Animation结束的时候,设置Menu clickable 以及 相应的 VISIBLITY. Menu消失时同样的原理.

<12>为Menu单独搞了一个ClickListener, 在onClick的时候,要先做一些判断,看fragment是否 isAdded, isDetached以及isRemoving
<这3个都是fragment自带的方法>

<13>在最初设计时, 右上角的按钮也做成了一个container view,这样实现在InEdit模式切换时,add另外一个按钮实现切换的效果,不过后来也没用上,直接通过换drawableResource实现了<在Edit模式下,Menu按钮的功能被替换为清除所有选中项>,多次一举了。

<14>Menu的onClickListener<C>, 做的基本都是触发event,然后让其他监听了event的对象来完成操作。

<15>DownloadFragment实现对不同模式的不同逻辑就是通过简单的 if 判断来实现的,似乎上升不到用更复杂模式的程度。

<16>在进入到Edit模式时, 要禁用ViewPager的滑动,这只能通过自定义ViewPager来实现<在onInterceptTouchEvent中,只有允许了滑动,才会返回super的onInterceptTouchEvent,否则直接返回false,这样就废掉了ViewPager的滑动>。

<17>会引起DownloadFragment进入Edit模式的都是由外部的对象触发的,因此这里DownloadFragment会监听相关的event,在Edit模式进行且切换。

<18>因为Menu只有开关两种状态,因此在显示/关闭Menu时,直接运行无参toggleMenu函数,每次取反。
当然还会留一个可以制定开关的辅助函数。

<19>模式切换影响的是M 和 V, M只影响一个变量(mInEdirMode), 而V则是一堆View的琐碎变化调整。

<20>在Edit模式下, 当用户选择了DownloadFragment的全选按钮以后,UI上要将当前ViewPager的Page的所有ItemView设置为
选中模式,根据封装性原则,这个具体的操作显然不能让DownloadFragment来做,而是交给ViewPager的PageAdapter自行处理。

<trival>
(1)DownloadFragment 本身所含的处理逻辑都是直白的, 也是琐碎的,这也是UI编程的一个普遍现象。
M/C 的改变 引起一堆V的变化。
0 0