加载中…
个人资料
一叶知秋
一叶知秋
  • 博客等级:
  • 博客积分:0
  • 博客访问:425,625
  • 关注人气:82
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

[转载]android 的横竖屏切换问题

(2012-09-26 10:59:04)
标签:

转载

分类: android开发

1.

总体来说有两种方案:

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();

    }

http://lishao378.blog.sohu.com/165342431.html

 

2.

横竖屏切换的响应

        如果没有设置强制横屏或者竖屏那么每次横竖屏切换的时候Activity都会被重新创建一次,这样就会存在一个问题 横屏后会把图片拉伸可能在竖屏时感觉很协调的界面切换到横屏以后会被拉伸的很难看,比较好的解决办法是为横竖屏做两套图做两个布局文件,这样子程序中只需要监听屏幕切换的结果 设置不同的布局 绘制不同的图片即可。




AndroidManifest.xml 中设置属性禁止重新创建Activity,并且添加屏幕切换监听。

  •                 <activity android:name=".HandlerActivity" android:configChanges="orientation|keyboardHidden"/>


复制代码
设置后屏幕切换后就不会再次调用OnCreate()方法重新创建这个Activity, 切换屏幕之前程序中的一些数据或者内容就不会因为重新创建Activity导致重置清空。 每当切换横竖屏的时候系统会自己调用onConfigurationChanged()方法这样子就可以拿到当前屏幕的横竖屏状态,根据状态就可以做我们想做的事。

  • import android.app.Activity;
  • import android.content.res.Configuration;
  • import android.os.Bundle;
  • public class HandlerActivity extends Activity {
  •     @Override
  •     protected void onCreate(Bundle savedInstanceState) {
  •         setContentView(R.layout.handler);
  •         super.onCreate(savedInstanceState);
  •     }
  •     @Override
  •     public void onConfigurationChanged(Configuration newConfig) {
  •         int type = this.getResources().getConfiguration().orientation;
  •         if (type == Configuration.ORIENTATION_LANDSCAPE) {
  •             //切换到了横屏
  •         } else if (type == Configuration.ORIENTATION_PORTRAIT) {
  •             //切换到了竖屏
  •         }
  •         super.onConfigurationChanged(newConfig);
  •     }
  • }

http://dev.10086.cn/cmdn/bbs/thread-61127-1-1.html

 3.一:不同的layout

Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢?
其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.Java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。
二:hdpi、mdpi、ldpi
在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。
drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:
(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
三:横屏竖屏
在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。以下步骤是网上流传的,不过我自己之前是通过图形化界面实现这个配置,算是殊途同归,有空我会把图片贴上来。
还要说明一点:每个activity都有这个属性screenOrientation,每个activity都需要设置,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。
要让程序界面保持一个方向,不随手机方向转动而变化的处理办法:

在AndroidManifest.xml里面配置一下就可以了。加入这一行
  • android:screenOrientation="landscape"
例如(landscape是横向,portrait是纵向):
Java代码:

  • <?xml version="1.0" encoding="utf-8"?>
  • <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ray.linkit"
  • android:versionCode="1"
    android:versionName="1.0">
  • <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Main"
  • android:label="@string/app_name"
    android:screenOrientation="portrait">
  • <intent-filter>
    <action android:name="android.intent.action.MAIN" />
  • <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  • </activity>
    <activity android:name=".GamePlay"
  • android:screenOrientation="portrait"></activity>
    <activity android:name=".OptionView"
  • android:screenOrientation="portrait"></activity>
    </application>
  • <uses-sdk android:minSdkVersion="3" />
  • </manifest>
另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
有的程序适合从竖屏切换到横屏,或者反过来,这个时候怎么办呢?可以在配置Activity的地方进行如下的配置android:screenOrientation="portrait"。这样就可以保证是竖屏总是竖屏了,或者landscape横向。
而有的程序是适合横竖屏切换的。如何处理呢?首先要在配置Activity的时候进行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重写Activity的onConfigurationChanged方法。实现方式如下,不需要做太多的内容:

  • @Override
  • public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
  • if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // land do nothing is ok
  • } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    // port do nothing is ok
  • }
  • }

  • http://www.3gtarena.com/danapeixunjishu/androidpeixun/471.html

0

  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有