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()可以重新加载布局文件。