Android fragment 只让一个fragment支持横屏

  • Post author:
  • Post category:其他


之前主界面还有其他界面采用了fragment,用到现在才发现,简单的fragment其实一点都不简单,里面有很多的方法可以很好的解决问题。下面有这样一个需求,在


其中一个fragment A必须要支持横屏,因为展示的数据是一个表格,有好几列,竖屏显示是显示不全的,要求只有这一个界面能够横屏


,解决方案:

在以前activity支持横屏是在主

android

Manifest.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,//根据重力变换朝向