本文实例讲述了Android开发使用活动嵌套多个片段实现横竖屏切换功能的方法。分享给大家供大家参考,具体如下:
近期项目遇到个横竖屏切换的问题,较为复杂,在此记之。
1,活动中竖屏嵌套3个片段,本文简称竖屏FP1, FP2, FP3。
2,其中竖屏FP1与FP2可以切换为横屏的FL1, FL2,即竖屏FP1切换到对应的横屏FL1,竖屏FP2对应切换到横屏FL2。
3,FP3不允许横竖屏切换。
4,竖屏FP1 FP2, FP3用:viewpage实现左右滑动切换。
5、横屏的FL1, FL2用布局中的切换按扭实现左右切换,不允许滑动切换。
看到这需求有点儿晕菜了吧! ! !呵呵! ! !
(一)先说说我走过的弯的路,将横竖屏切换在一个活动中实现。
(1),在一个活动中实现横竖屏切换难在什么地方呢?主要是横竖屏切换,活动有它自己的生命周期,片段也有它的生命周期,而且活动的生命周期左右着碎片的生命周期。最复杂的地方是,首次横竖屏切换时,活动的<代码> onDestory() 代码>方法会执行,在执行此方法之前,片段的<代码> onDestoryView() 代码>首先会获得执行,接着会执行<代码> onCreateView() 代码>方法。而首次切换到横屏时,活动的<代码> onCreate() 代码>方法会执行,接着横屏FL1的<代码> onCreateView() 代码>方法又会执行,这样的话,片段的布局就会发生覆盖。(这是我在做的时候发现的问题,不知道其他人是否遇到)。
(2),在一个活动中横竖屏切换,竖屏布局与横屏布局不一样,本文示例竖屏为活动中嵌套3个片段,横屏嵌套2个片段,首先会有很多页面状态需要记录,其次就是活动与片段的生命周期关系问题,确实挺复杂,控制这里面的状态,只有做过的人才知道有多苦。
(二)可取的办法,将横竖屏切换在两个活动中实现
1,首先当然是要让两个活动能够横竖切,这里首先需要在AndroidManifest.xml中配置两个活动能够横竖切换,配置如下:
& lt;活动 android: name=" .ActivityPort " 面向android: configChanges=" | keyboardHidden |拉” android: label=" @string/app_name” android: windowSoftInputMode=" stateAlwaysHidden | adjustPan”比; & lt; intent-filter> & lt;行动android: name=" android.intent.action.MAIN "/比; & lt;类别android: name=" android.intent.category.LAUNCHER "/比; & lt;/intent-filter> & lt;/activity> & lt;活动 android: name=" .ActivityLand " 面向android: configChanges=" | keyboardHidden |拉” android: label=" @string/app_name” android: windowSoftInputMode=" stateAlwaysHidden | adjustPan”/比; >之前可点击此处查看较为详细的Android权限设置说明
2,竖屏活动的切换到横屏活动的时候,通过意图跳转到横屏的活动,然后将当前活动给完成()掉。反之也是一样的逻辑。那么现在面临的一个问题是什么,这个跳转写在什么地方,写在<代码> onDestory() 代码>方法中显然是不合适的,因为这个方法在横竖切的时候会始终执行,当你在按回退键返回到上一个页面时,同样会执行这个方法,这样跳转的话,就会死循环,会总是打开页面。这时候就想到了活动的<代码> onConfigurationChanged() 代码>方法.Google官网说横竖屏切换不希望大家用这个方法实现横竖屏切换,但是遇到了这样怪异的需求,不得不使用。上代码:
@Override 公共空间> 包com.example.screenswitch; 进口java.util.ArrayList; 进口并不知道; 进口android.app.Activity; 进口android.content.Intent; 进口android.content.pm.ActivityInfo; 进口android.content.res.Configuration; 进口android.os.Bundle; 进口android.support.v4.app.Fragment; 进口android.support.v4.app.FragmentActivity; 进口android.support.v4.app.FragmentManager; 进口android.support.v4.app.FragmentTransaction; 进口android.support.v4.view.ViewPager; 进口android.view.KeyEvent; 进口com.example.screenswitch.adapter.ChartFragmentPagerAdapter; 进口com.example.screenswitch.application.DataCache; 进口com.example.screenswitch.fragments.Fragment1; 进口com.example.screenswitch.fragments.Fragment2; 进口com.example.screenswitch.fragments.Fragment3; 公开课ActivityPort延伸FragmentActivity { 私有静态最终字符串标签=癆ctivityPort”;/* *页面类型——竖屏1 * */公共静态最终int PORT_PAGE_1=1;/* *页面类型——竖屏2 * */公共静态最终int PORT_PAGE_2=2;/* *页面类型——竖屏3 * */公共静态最终int PORT_PAGE_3=3; 私人:viewpage vpChartPage; 私人Fragment1 Fragment1; 私人Fragment2 Fragment2; 私人Fragment3 Fragment3;/* *竖屏FragmentManager * */私人FragmentManager portfragmentManager;/* * fragmentTransaction * */私人FragmentTransaction mFragmentTransaction;/* *片段集合* */私人ListAndroid开发使用活动嵌套多个片段实现横竖屏切换功能的方法