Android fragment 只让一个fragment支持横屏

    还是这个手机项目,别嫌我烦,只想记录一下同事指导的代码,分享给你们。

    之前主界面还有其他界面采用了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

     

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值