zoukankan      html  css  js  c++  java
  • 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);



  • 相关阅读:
    java——ArrayList中remove()方法疑问总结
    java——ArrayList中contains()方法中的疑问
    C语言中signed和unsigned理解
    IO流——常用IO流详解
    Lost's revenge
    Searching the String
    DNA repair
    Ring
    Wireless Password
    Censored!
  • 原文地址:https://www.cnblogs.com/mauiie/p/3966421.html
Copyright © 2011-2022 走看看