横竖屏切换后,界面效果错乱的问题,android已经为我们提供了较完美的解决方案,那就是新建备选资源,让横竖屏切换后的activity分别对应不同的xml文件(但资源id相同)。
备选资源
如果对于横屏屏有着不同的布局要求,那么就需要新建一个备选资源,首先在res目录下新建一个文件夹并命名为layout-land,随后在layout-land目录下新建一个相同名字的xml布局,一个技巧就是可以直接将activity_summary.xml布局从layout目录下复制到layout-land目录之下,随后再根据需求更改xml布局,本例中src目录结构如下:
这是layout目录下activity_summary.xml的普通布局。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_hw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="我在中间位置"
android:textSize="18sp"
android:textColor="#787878"
/>
</RelativeLayout>
而这是layout-land目录下的activity_summary.xml的布局,注意横屏和竖屏的两个布局文件名字必须一致,这样才能保证它们能以同一个资源ID被引用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_hw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="我来顶部哈"
android:textSize="18sp"
android:textColor="#787878"
/>
</RelativeLayout>
运行看下效果,效果图1是正常居中布局,而图2是我们适配的横向居中效果。
关闭横竖屏自动切换
第一种方法就是在清单中在相应的activity中指定特定方向,其中portrait为竖向,landscape为横向
<activity android:name=".ActivitySummary2"
android:screenOrientation="portrait"
/>
第二种方法就是可以在代码中动态添加
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//横屏
setContentView(R.layout.activity_summary);
}
如果你不想关闭横竖屏切换功能,但又不想Activity在屏幕旋转的时候重新创建,那么我们可以给Activity指定configChanges属性
android:configChanges="orientation|keyboardHidden|screenSize"
其中orientation表示屏幕方向发生了改变;keyboardHidden表示键盘的可访问性发生了改变,比如用户调出了键盘;screenSize表示当编译时minSdkVersion和targetSdkVersion不低于或不全低于13时,当屏幕的尺寸信息发生了改变时,会导致Activity重建。