Android开发:从0到1 (清华开发者书库)
上QQ阅读APP看书,第一时间看更新

6.3 屏幕旋转问题

在Android中,有些应用在横屏(Landscape)和竖屏(Portrait)的时候,采用不同的布局,如图6-17所示为Android计算器,在竖屏的时候是简单计算功能,而在横屏的时候是带有科学计算法的功能。

图6-17 Android计算器

提示 在移动开发中,横屏英文单词是Landscape,竖屏英文单词是Portrait。Landscape本意是风景画,Portrait本意是肖像画。由于在油画中风景画是横幅的,而肖像画是竖幅的,因此Landscape暗示横屏,Portrait暗示竖屏。

6.3.1 解决方案

为了实现不同的布局,至少需要定义两个布局文件,然后在程序中加载不同的布局文件,或者是采用代码方式创建两套布局文件。

解决问题的核心是:如何判断当前设备处于横屏还是竖屏。

下面的语句判断设备处于横屏或竖屏状态:

     this.getResources().getConfiguration().orientation== Configuration.ORIENTATION_PORTRAIT

this是当前Activity, getResources().getConfiguration().orientation表达式可以设备朝向。设备朝向常量有三个:

❏ Configuration.ORIENTATION_PORTRAIT。常量是设备处于竖屏状态。

❏ Configuration.ORIENTATION_LANDSCAPE。常量是设备处于横竖屏状态。

❏ Configuration.ORIENTATION_UNDEFINED。常量是设备处于未知状态。

Activity参考代码如下:

        public class MainActivity extends AppCompatActivity{

            @Override
            protected void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
                if(this.getResources().getConfiguration().orientation
                            == Configuration.ORIENTATION_PORTRAIT){
                    //加载竖屏
                }else{
                    //加载横屏
                }
            }

        }

6.3.2 实例:加载不同布局文件

加载不同布局文件的实例如图6-18所示,在竖屏时控件上下摆放,见图6-18(a),在竖屏时控件左右摆放,见图6-18(b)。

图6-18 加载不同布局文件实例

竖屏布局文件portrait.xml代码如下:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

          <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/accent_material_dark"
            android:layout_weight="1"/>

          <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/button_material_light"
            android:layout_weight="1"/>

      </LinearLayout>

横屏布局文件landscapet.xml代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="horizontal">

      <TextView
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_weight="1"
          android:background="@color/accent_material_dark"/>

      <TextView
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_weight="1"
          android:background="@color/button_material_light"/>

    </LinearLayout>

MainActivity代码如下:

    public class MainActivity extends AppCompatActivity{

        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            if(this.getResources().getConfiguration().orientation
                        == Configuration.ORIENTATION_PORTRAIT){
                //竖屏
                setContentView(R.layout.portrait);
            }else{
                //横屏
                setContentView(R.layout.landscape);
            }
        }

    }

Activity中当setContentView()可以重新加载布局文件。