总体来说有两种方案:
1.Android系统自动切换
利用Android系统每次屏幕切换会重启Activity的特性,在OnCreat处自动加载不同显示状态下的layout。
例:main.xml是竖屏状态下的layout,文件保存于res/layout文件夹中。为实现横屏切换,建立文件夹res/layout-land,在里面创建新的界面文件main.xml,与res/layout文件夹中文件同名。则当设备由竖屏切换到横屏,或者反之时,在onCreate()函数中直接执行setContentView(R.layout.main)即可自动加载不同的界面文件。
另外,在res/layout-land中建立同名文件是用系统自动判断加载,也可以手动判断加载。如在res/layout文件夹中有竖屏界面main-P.xml及横屏界面main-L.xml,则可以在onCreate()函数中通过判断横竖屏状态以显式加载不同界面,代码:
int mCurrentOrientation = getResources().getConfiguration().orientation;
if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) {
// If current screen is portrait
setContentView(R.layout.main-P);
} else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) {
//If current screen is landscape
setContentView(R.layout.main-L);
}
由于android系统屏幕切换会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置。
2.利用Activity的onConfigurationChanged()方法手动切换
为避免Android系统自动重启activity,需要在Androidmanifest.xml中相应Activity加上android:configChanges="keyboardHidden|orientation"属性,使相应的Activity不重启而是调用onConfigurationChanged(Configuration newConfig)。
例:res/layout下有竖屏界面main-P.xml及横屏界面main-L.xml。onCreate()时同理判断以显示不同的界面:
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
int mCurrentOrientation = getResources().getConfiguration().orientation;
if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) {
// If current screen is portrait
setContentView(R.layout.main-P);
} else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) {
//If current screen is landscape
setContentView(R.layout.main-L);
}
init();//初始化,赋值等操作
findViews();//获得控件
setListensers();//设置控件的各种监听方法
}
重载onConfigurationChanged():
@Override
public void onConfigurationChanged (Configuration newConfig){
super.onConfigurationChanged(newConfig);
int mCurrentOrientation = getResources().getConfiguration().orientation;
if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) {
// If current screen is portrait
setContentView(R.layout.main-P);
//注意,这里删除了init(),否则又初始化了,状态就丢失
findViews();
setListensers();
} else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) {
//If current screen is landscape
setContentView(R.layout.main-L);
//注意,这里删除了init(),否则又初始化了,状态就丢失
findViews();
setListensers();
}
}
以上代码中需要注意init()函数,若需要保存其它的状态,如Button及各种View的显示文字已经改变,在setListensers()务必进行恢复操作。
同样,也可以使用res/layout/main.xml和res/layout-land/main.xml方式,则不需判断,直接使用setContentView(R.layout.main)即可。看代码:
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
init();//初始化,赋值等操作
findViews();//获得控件
setListensers();//设置控件的各种监听方法
}
重载onConfigurationChanged():
@Override
public void onConfigurationChanged (Configuration newConfig){
super.onConfigurationChanged(newConfig);
int mCurrentOrientation = getResources().getConfiguration().orientation;
if ( mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT ) {
// If current screen is portrait
setContentView(R.layout.main);
//注意,这里删除了init(),否则又初始化了,状态就丢失
findViews();
setListensers();
} else if ( mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE ) {
//If current screen is landscape
setContentView(R.layout.main);
//注意,这里删除了init(),否则又初始化了,状态就丢失
findViews();
setListensers();
}
}
其实在这种模式下,由于Android系统自动寻找不同界面文件,而Androidmanifest.xml中已定义了android:configChanges="keyboardHidden|orientation"只监听方向改变,因此onConfigurationChanged()方法还可以继续精简(除非在横竖屏下状态不同),直接设置界面、恢复状态即可:
@Override
public void onConfigurationChanged (Configuration newConfig){
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
//注意,这里删除了init(),否则又初始化了,状态就丢失
findViews();
setListensers();
}
分享到:
相关推荐
在Android开发中,屏幕方向的切换是常见的需求之一,尤其在设计多布局或者特定场景(如游戏、...在提供的"Android 简单例子:横屏 竖屏切换.rar"资源中,应该包含了实现这一功能的具体源代码,你可以下载学习和参考。
针对"android竖屏切换横屏"这一主题,我们主要探讨如何在基于MediaTek (MTK) 平台的手机上实现屏幕方向的切换,将默认的竖屏显示转变为横屏模式。 首先,Android系统提供了两种主要的屏幕方向:Portrait(竖屏)和...
还是这个手机项目,有一个需求是整个工程中只有刚进去的界面允许横屏显示,并且要将该界面的标题隐藏,当切换回竖屏显示的时候,标题变为可见,一开始我百度了一下有一个监听activity是否横屏竖屏的监听函数,如下:...
1. **保留Fragment状态**:如果希望Fragment在横竖屏切换时保持状态,可以重写Activity的onSaveInstanceState(Bundle outState)和onCreate(Bundle savedInstanceState)方法,保存和恢复Fragment的相关数据。...
而我希望平板是横屏的,来查看fragment在宽屏上的应用效果,这竖屏的平板感觉只是放大版的手机~ 本来设计的两个fragment在竖屏的平板上看都“太瘦”了,反而有些奇怪,影响学习体验。 搜索博客找解决方案,上面全都...
本文实例讲述了Android编程基于重力传感器实现横竖屏放向切换功能。分享给大家供大家参考,具体如下: 最近项目中用到了vr视频播放,因为自己实现,同时要实现横竖屏自动切换屏幕,核心代码如下: package ...
Android系统支持多种屏幕尺寸和方向,包括横屏(Landscape)和竖屏(Portrait)。本篇文章将深入探讨如何在Android中实现屏幕的切换,以及在横竖屏之间转换时需要注意的关键点。 首先,Android系统会根据设备的物理...
Android系统默认支持屏幕方向的变化,但为了实现平滑的横竖屏切换,我们需要在`AndroidManifest.xml`中为快应用设置屏幕方向属性,并在代码中适当地保存和恢复状态。当屏幕方向改变时,系统会调用`...
在Android开发中,屏幕方向的切换通常是全局性的,即整个应用程序要么始终处于竖屏模式,要么始终处于横屏模式。然而,在某些特定场景下,我们可能希望某个或某些页面能够独立于全局设置,自由地在横屏和竖屏之间...
在开发移动应用时,为了适应不同设备的屏幕尺寸及方向变化,通常需要实现横竖屏自动切换的功能。具体而言,开发者可以通过在项目中为不同方向的屏幕设置专门的布局文件来实现这一目的。 - **建立布局文件**:在`...
Android 编程实现播放视频时切换全屏并隐藏状态栏的方法 Android 编程实现播放视频时切换全屏并隐藏状态栏的方法是指在 Android 应用程序中,如何在播放视频时实现在全屏模式下隐藏状态栏的技术。这种技术可以在 ...
为了确保横竖屏都能正常工作,我们需要在Activity中适当地保存和恢复状态。同时,确保扫描界面的布局在不同屏幕方向下都能正确显示。这通常通过在XML布局文件中使用`android:configChanges="orientation|screenSize...
在Android应用开发中,横竖屏切换是常见的场景,但默认情况下,Android系统在屏幕方向发生变化时会销毁并重新创建当前的Activity,导致数据丢失和用户体验中断。要实现横竖屏切换时不销毁当前Activity,以及锁定屏幕...
综上所述,要实现一个良好的横竖屏切换功能,需要理解并妥善处理不同平台对于方向变化事件处理的差异,以及针对这些差异进行适当的兼容性编程。此外,持续关注和测试最新的移动浏览器表现,以便在必要时更新和优化...
在Android应用开发中,横竖屏切换是常见的用户交互场景,它涉及到Activity的生命周期管理。Activity是Android系统中用户界面的基本单元,它承载了应用程序的主要交互逻辑。当设备从竖屏旋转到横屏,或者反之,...
**屏幕横屏与竖屏切换**: 1. **自动切换**:在`res`目录下创建`layout-port`(竖屏)和`layout-land`(横屏)目录,放入相应布局文件。系统会在屏幕方向改变时自动使用正确的布局。如果希望禁止某Activity自动旋转...
本文将详细讨论Android横竖屏处理的相关知识点,包括决定界面旋转方向的因素、代码中设置横竖屏的方法以及横竖屏切换时Activity的生命周期变化。 首先,决定Android应用界面旋转方向的因素主要有三个方面: 1. **...
此外,布局文件也需要根据横竖屏分别编写,通常存放在layout-land(横屏)和layout-port(竖屏)目录下。 在源码分析中,我们可以看到MainActivity如何初始化并设置两个ListView,以及它们的适配器是如何工作的。...