android 横竖屏先关操作

  今天处理了点关于android横竖屏的效果,半天下来觉得这个横竖屏的相关操作还是有很多的,废话结束--------------

首先看看最常见的横竖屏幕的控制,在清单文件中可以设置Activity是否支持横屏,要以什么样的方式展示(横屏、竖屏),常见的设置方式就是在Activity中加上

android:screenOrientation="XXX" ,这样就能限定该Activity是否的展示方式.
<activity
            android:name=".ui.DetailsVideoActivity"
            android:hardwareAccelerated="false"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@style/Theme.PageIndicatorDefaults" >
        </activity>
android:screenOrientation="XXX",一下是XXX的属性值“portrait”   :纵向显示(高度>宽度)“landscape”  :横向显示(高度<宽度)(这两种比较常用)“behind”     :与上一个Activity一致“user”    :与用户首选项一致“unspecified”:默认,由系统选择方向(不确定跟随系统)“sensor”     :跟随设备的方向传感器“fullSensor” :显示设备传感器传来的四个方向 ,这样设定之后Activity也就会按照这种方式来显示了。
 ----------------------------------------------------------------------------------------------------- 以上最简单的设置方式,但是当屏幕由横屏切换为树屏、以及由竖屏切换到横屏的时候的处理往往是让我们感到棘手的,也正是这里才是难以处理的。在屏幕状态切换的时候通常会重新调用各个生命周期的,相当于重新装载Activity,这时候数据往往都会消失,但是我们也可以保存切换时的状态的在Activity类里覆写onConfigurationChanged()方法来保存当前Activity的状态(数据)
1 @Override
2     protected void onSaveInstanceState(Bundle outState)
3     {
4         super.onSaveInstanceState(outState);
5         outState.putString(Constant.RUL_STORE, webView.getUrl());  //保存数据
6         System.out.println("onSaveInstanceState"  + "---->" + webView.getUrl());
7     }

然后使用的时候可以复写 onRestoreInstanceState方法来获取之前的状态(数据):

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        super.onRestoreInstanceState(savedInstanceState);
        if(null!=savedInstanceState)
        {
            System.out.println("onRestoreInstanceState"  + "---->" + savedInstanceState.getString(Constant.RUL_STORE));
            urlStore = savedInstanceState.getString(Constant.RUL_STORE);
        }
    }

这样就可以在横竖屏切换的时候保存activity的状态(数据),以便使用。

当然有时候我们不想让Activity在切换横竖屏的时候重新调用生命周期,因为这样很可能丢失当前Activity的状态,这时候我们就要在清单文件的Activity节点下加上android:configChanges属性了:

  <activity
            android:name="com.lome.jy.MainActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:label="@string/app_name" >
 android:configChanges="keyboardHidden|orientation|screenSize" 加上这个之后在横竖切换的时候就不会重新调用Activity的生命周期了。

android:configChanges的设置对Activity切换横竖屏的影响还是很大的:

不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

 1 /**
 2      * onConfigurationChanged
 3      * the package:android.content.res.Configuration.
 4      * @param newConfig, The new device configuration.
 5      * 当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时,
 6      * 并且如果此时有activity正在运行,系统会调用这个函数。
 7      * 注意:onConfigurationChanged只会监测应用程序在AnroidMainifest.xml中通过
 8      * android:configChanges="xxxx"指定的配置类型的改动;
 9      * 而对于其他配置的更改,则系统会onDestroy()当前Activity,然后重启一个新的Activity实例。
10      */
11     @Override
12     public void onConfigurationChanged(Configuration newConfig) {
13         super.onConfigurationChanged(newConfig);
14         // 检测屏幕的方向:纵向或横向
15         if (this.getResources().getConfiguration().orientation
16                 == Configuration.ORIENTATION_LANDSCAPE) {

23             DisplayMetrics displaysMetrics = new DisplayMetrics();
24             this.getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);
25             int pixWidth= displaysMetrics.widthPixels;
26             int height= displaysMetrics.heightPixels;
27             LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
28                     pixWidth,height-20);
29             webView.setLayoutParams(mLayoutParams);
30 //            webView.reload();
31             webView.refreshDrawableState();
33         }
34         else if (this.getResources().getConfiguration().orientation
35                 == Configuration.ORIENTATION_PORTRAIT) {
36             //当前为竖屏

37             DisplayMetrics displaysMetrics = new DisplayMetrics();
38             this.getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);
39             int pixWidth= displaysMetrics.widthPixels;
40             int height= displaysMetrics.heightPixels;
41             LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
42                     pixWidth,height-20);
43             webView.setLayoutParams(mLayoutParams);
44             webView.refreshDrawableState();
45         }
46         //检测实体键盘的状态
47         if (newConfig.hardKeyboardHidden
48                 == Configuration.HARDKEYBOARDHIDDEN_NO){
49             //实体键盘处于推出状态
50         }
51         else if (newConfig.hardKeyboardHidden
52                 == Configuration.HARDKEYBOARDHIDDEN_YES){
53             //实体键盘处于合上状态
54         }
55     }

如此一来我们就可以在onConfigurationChanged方法中去监听手机屏幕的变化,这样我们能做的事情就有很多了,改变样式,更改内容 ....

另外可以在这里有选择性的设置禁止横屏(竖屏):

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

				
时间: 2024-08-24 16:25:09

android 横竖屏先关操作的相关文章

Android横竖屏切换处理

Android横竖屏要解决的问题应该就两个: 1.布局问题:2.重新载入问题   一.布局问题: 如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数: "unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向. "landscape":横屏显示(宽比高要长

Android横竖屏切换总结

Android横竖屏切换总结(Android资料) Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数: "unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向. "lan

Android横竖屏布局总结

Android横竖屏要解决的问题应该就两个:一.布局问题;二.重新载入问题. 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数: "unspecified" 默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向. "landscape" 横屏显示(宽比高要长)

Android横竖屏总结全

Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数: "unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向. "landscape":横屏显示(宽比高要长) &

Android横竖屏切换及其对应布局加载问题

第一,横竖屏切换连带横竖屏布局问题: 如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局. 可以通过以下两种方法来切换布局: 1)在res目录下建立layout-land和layout-port目录,相应的layout文件名不变,比如:layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,横竖屏切换时程序调用Activity的onCreate方法中的setOnContent(xxx),并自动加载相应的布局. 2)假如布

Android横竖屏总结(转)

Android横竖屏总结(转) 横竖屏切换后Activity会重新执行onCreat函数,但是在Android工程的Mainfest.xml中加入android:screenOrientation="user" android:configChanges="orientation|keyboardHidden"之后,横竖屏切换之后就不会去执行OnCreat函数了,而是会去调用onConfigurationChanged(),这样我们就能控制横竖屏的切换了.或者在re

android横竖屏切换时Activity的生命周期

1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--> onStart--> onResume--> 3.按crtl+f12切换成横屏时 onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState--> onResume--> 4.再

android 横竖屏限制如何配置

在开发android的应用中,有时候需要限制横竖屏切换.只需要在AndroidManifest.xml文件中加入android:screenOrientation属性限制. ndroid:screenOrientation="landscape"是限制此页面横屏显示, ndroid:screenOrientation="portrait"是限制此页面数竖屏显示. 例如:我现在想让所有的页面不管怎么样都竖屏显示,则我的AndroidManifest.xml应该这样写:

让Android横竖屏切换时不销毁当前activity

网上查到资料: 对 节点<activity/> 添加属性“ android:configChanges="orientation|keyboardHidden|screenSize" ”,如下所示: 1 <activity 2 android:name=".MainActivity" 3 android:label="@string/app_name" 4 android:configChanges="orientat