我们在进行安卓程序开发的时候,经常会用到切换界面,至于为什么要转换界面,可能有各种各样的原因,不是一言两语能说清楚的,此处略过不表,当需要切换界面时,我们通常有以下几种方式来实现:
1.Activity的切换,我们最初学习且最常用的界面转换莫过于Activity的切换了。Activity的切换自带转场动画,并启动一个新的Activity,在新的Activity上面,我们可以加载全新的布局,包括进行其他我们想要的操作。具体步骤:首先创建一个意图,通过这个意图来寻找并启动Activity,如果是显示意图,直接启动指定的Activity即可;若是隐式意图,则寻找符合条件的Activity,通过intent-filter里面的action属性来匹配,找到符合条件的则启动Activity。
这种转换界面的的优点是显而易见的,首先,操作方便,没有许多繁琐的步骤,通过创建意图就能实现界面的转换;其次过程清晰明了,基本按照从上到下的顺序执行代码就行;而且,参数或数据的传递简单,最多就是传递序列化的对象而已。
2.Activity上面Fragment的切换。Fragment是Android3.0推出的新特性,意义是“碎片”,大体上具备Activity的功能,可以理解为Activity的片段,具有和Activity类似的生命周期。谷歌推荐在需要多个布局并存的时候使用Fragment,Fragment依赖于Activity存在,其生命周期包含在Activity的生命周期之内,但是比Activity的生命周期有着更多的阶段,除了本身的创建,启动,暂停,停止和销毁以外,还有依附于Activity的一些生命周期特征,可以通过碎片管理器来对Activity上的Fragment进行管理。
如何利用Fragment进行界面的切换?首先,既然是切换,肯定涉及多个界面,假定一个Fragment占据完整的Activity视窗,那么在这些不同的Fragment之间进行切换就实现了界面的切换。首先需要创建Fragment集合List<Fragment> list,然后获得基于Activity的Fragment管理对象FragmentManager,通过管理对象开启事务获取Fragment事务对象,FragmentTransaction,事务对象有add,replace等方法来对Fragment进行添加,替换等操作。
这种转换界面的方式在复杂的界面布局上最为谷歌所推荐,并有很多针对于Fragment的官方框架,例如support-v4包下的ViewPager等等。这种转换界面既然是官方推荐的,我们自然应当努力善用,优点太多了,就不细说了。
3.Activity或者Fragment上的动画翻转。其实以前两种来实现界面的转换已经十分够用了,但我们要注意到,Activity是Android的核心组件,Fragment也至少是一个布局,在实现它们的时候,Android的底层框架需要做很多事情,可能我们并不完全知道,也不关心Android Framework到底做了什么。事实上,Android Framework通过reflect把我们的XML文件加载并显示,并监听相应的事件,启动并操作一个Activity对系统资源有着可观的消耗,有时候并不一定是最佳的选择。至于Fragment,由于这个组件的特殊性,在和Activity进行数据或参数传递的时候有一些限制性,一般的处理方式有:1)创建Activity的成员变量,可由不同的Fragment来访问和操作;2)通过setArguments和getArguments来传递参数,但这种参数传递方式很不靠谱,用了就知道了;3)在Fragment中设置回调接口,然后由Activity来实现这个回调接口,从而实现Activity和Fragment,或者Fragment 之间的参数传递,这种方式效率最高,但是理解起来有一定难度,而且能处理的事情有限,一般来说一个Fragment只能设置一个回调接口,Activity实现接口的时候,如果多重实现可能会导致逻辑混乱,也不太好处理。
所谓第3种解决方案就是,Activity或者Fragment只有一个,但是独占Activity的布局有多个,当其中一个显示时,其他的则隐藏,对于一些不太复杂的界面,需要切换界面时,我建议采用这种方式来处理,如下图所示:
图中所为的Activity1和Activity2其实是同一个Activity,这么写只是为了指代两个界面,界面1显示的时候,界面2是隐藏的,当我们在界面1上的操作处理完之后,需要转换界面继续,通过触发事件,执行一个翻转动画,将界面1隐藏,界面2显示,看起来就像由界面1跳转到了界面2一样,实际上这并不是跳转,只是布局的显示和隐藏而已。
使用这种方式来处理界面转换时,不需要进行参数传递,因为本来就在同一个界面,不需要启动多余的Activity,创建Fragment,方便之处是显而易见的。当然,这种方法也有很大的局限性,如果界面过于复杂,Activity本来就执行了太多的操作,此时加载更多的布局和事件可能会影响到系统的运行。
推荐使用环境:当界面内容不多,布局相对简单,但某些功能性的需要要求界面必须转换的时候,这种方式就非常好用了。