还是这个手机项目,别嫌我烦,只想记录一下同事指导的代码,分享给你们。
之前主界面还有其他界面采用了fragment,用到现在才发现,简单的fragment其实一点都不简单,里面有很多的方法可以很好的解决问题。下面有这样一个需求,在其中一个fragment A必须要支持横屏,因为展示的数据是一个表格,有好几列,竖屏显示是显示不全的,要求只有这一个界面能够横屏,解决方案:
在以前activity支持横屏是在主AndroidManifest.xml中设置主界面是否支持横竖屏:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="client.verbank.mtp.allone.LoginActivity"
android:configChanges="keyboardHidden|orientation"
android:label="@string/app_name"
android:screenOrientation="portrait" <!-- 设定进去的为竖屏格式-->
android:theme="@android:style/Theme.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
注意:上面配置解释参考:http://www.cnblogs.com/lijunamneg/archive/2013/03/26/2982461.html
在一些特殊的情况中,你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置 android:configChanges属性来实现这点。
你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调用activity的
onConfigurationChanged(Resources.Configuration)方法。如果改变的配置中包含了你所无法处理的配置(在android:configChanges并未声明),
你的activity仍然要被重新启动,而onConfigurationChanged(Resources.Configuration)将不会被调用。
其次:android:configChanges=""中可以用的值:keyboard|mcc|mnc|locale|touchscreen|keyboardHidden|navigation|orientation……
Configuration 类中包含了很多种信息,例如系统字体大小,orientation,输入设备类型等等.(如上图)
比如:android:configChanges="orientation|keyboard|keyboardHidden"
当Configuration改变后,ActivityManagerService将会发送"配置改变"的广播,会要求ActivityThread 重新启动当前focus的Activity.
这是默认情况,我们不做任何处理,如果我们android:configChanges来配置Activity信息,那么就可以避免对Activity销毁再重新创建,而是调用
onConfigurationChanged方法。
通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChanged()方法。
在AndroidManifest.xml中添加上诉代码的含义是表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行onCreate()方法,
而是直接执行onConfigurationChanged()。如果不申明此段代码,按照Activity的生命周期,都会去执行一次onCreate()方法,而onCreate()方法通常会在显示之前做一些初始化工作。所以如果改变屏幕方向这样的操作都去执行onCreate()方法,就有可能造成重复的初始化,降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。这是需要千万避免的。
然后在mainactivity中添加配置信息改变的监听方法:
// 橫屏不重新加載activity,調用該方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 如果是橫屏時候
try {
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
toolbarLayout.setVisibility(View.GONE);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
toolbarLayout.setVisibility(View.VISIBLE);
}
} catch (Exception ex) {
}
}
如果手机开启了允许横竖屏的话,所有的fragment界面,在横屏的时候都会横着,这样明显不能满足项目的需求, 我们解决的思路就是:
在要支持横竖屏的fragment A中,监听是否已经隐藏的方法里面,判断如果已经隐藏,就不支持横竖屏,如果show展现的时候,就可以使用横竖屏,代码如下:
@Override
public void onHiddenChanged(boolean hidd) {
getActivity().setRequestedOrientation(//通过程序改变屏幕显示的方向
hidd ? ActivityInfo.SCREEN_ORIENTATION_NOSENSOR
: ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
Activity屏幕属性有以下几种:
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE,//指定横屏
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,//指定竖屏
ActivityInfo.SCREEN_ORIENTATION_USER,//根据用户朝向
ActivityInfo.SCREEN_ORIENTATION_NOSENSOR,//不受重力影响
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE,//横屏动态转换
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT,//竖屏动态转换
ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR,//根据重力变换朝向
感谢各位前辈提供的总结!!!更多横竖屏的知识,这位前辈讲的超级详细,可以参考:http://www.cnblogs.com/franksunny/p/3714442.html