`
lifeijiyuan
  • 浏览: 40214 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

横竖屏切换问题

 
阅读更多
问题如下:


--------------------------
要解决的问题应该就两个:
一。布局问题;
二。重新载入问题。
1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:
"unspecified"
默认值由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
"landscape"
横屏显示(宽比高要长)
"portrait"
竖屏显示(高比宽要长)
"user"
用户当前首选的方向
"behind"
和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
"sensor"
有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
"nosensor"
忽略物理感应器,这样就不会随着用户旋转设备而更改了( "unspecified"设置除外)。
也可以在Java代码中通过 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);来设置。如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。

可以通过以下方法来切换布局:
1)在res目录下建立layout-land和layout-port目录,相应的layout文件不变,比如main.xml。layout- land是横屏的layout,layout-port是竖屏的layout,其他的不用管,模拟器会自动寻找。

2)通过this.getResources().getConfiguration().orientation来判断当前是横屏还是竖屏然后来加载相应的xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的 OnCreate中来检查当前的方向,然后可以让你的SetContentView来载入不同的Layout xml.


if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {  
Log.i("info", "landscape");  
}  
else
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {  
Log.i("info", "portrait");  


2.重新载入问题。如果不需要从新载入,可以在androidmanifest.xml中加入配置 android:configChanges="orientation",配置android:configChanges的作用就是如文档所说的:
Specify one or more configuration changes that the activity will handle itself. If not specified, the activity will be restarted if any of these configuration changes happen in the system。
这样在程序中. Activity就不会重复的调用onCreate()甚至不会调用onPause.onResume.只会调用一个 onConfigurationChanged(Configuration newConfig)。

其实在这里我遇到两个奇怪的问题,那就是
1.如果我在android:configChanges中只设置orientation,他依然会重新加载,只有设置了 orientation|keyboardHidden它才会只调用一个onConfigurationChanged(Configuration newConfig)

2.当横屏变竖屏的时候,他会调用两次onConfigurationChanged,而竖屏转横屏时他只调用一次 onConfigurationChanged,真是太奇怪了。如果你知道,欢迎留言共同探讨.

如果需要重新载入,则不需要做任何修改。不过如果需要在重新载入过程中保存之前的操作内容或数据,则需要保存之前的数据。然后在activity的 onCreate()中取出来。当然,如此就不能设置android:configChanges()了,否则就不会调用onCreate()方法。那么数据可以保存在哪呢?Android中四种存储方法都可以,另外,还可以用Android为我们提供了 onRetainNonConfigurationInstance()方法来暂时保存数据。
下面为此举个例子:
保存临时图片:


@Override
public Object onRetainNonConfigurationInstance() {   
final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];  
    keepPhotos(list);   
return list;  
}   
之后便可以在activity的onCreate()函数中实现重新调用临时文件,在代码中需要判断系统是否需要重新加载临时文件。以下是放在 OnCreate()函数中加载临时文件的代码:


private
void loadPhotos() {  
final Object data = getLastNonConfigurationInstance();   
// The activity is starting for the first time, load the photos from Flickr 

if (data == null) {  
        mTask = new GetPhotoListTask().execute(mCurrentPage);   
    } else {  
// The activity was destroyed/created automatically, populate the grid 

// of photos with the images loaded by the previous activity 
final LoadedPhoto[] photos = (LoadedPhoto[]) data;   
for (LoadedPhoto photo : photos) {  
            addPhoto(photo);   
        }  
    }  
}  
对于大多数的情况并不需要做如上的操作,所以需要谨慎使用这个行文,毕竟最好的行为也并不适用于所有情况,如果应用的不好反而会给程序带来不必要的麻烦。

如果要彻底禁止翻转,可以设置android:screenOrientation的属性为nosensor,如此就可以忽略重力感应带来的麻烦了。不过不知道为什么,在模拟器上不管用,听别人说在真机上是正确的,我没有真机,等有了真机再试试看
-----------------------------
Android:通过Linux Shell实现Android横竖屏切换
平时在开发过程中如何切换Android横屏或竖屏显示方式呢? eoe今天分别给出两种方法分别为快捷键兼容模拟器和Linux Shell在真机成功处理。

方法一:

在模拟器调试中通过Ctrl+F11可以切换到横屏即landscape方式显示,而通过Ctrl+F12则emulator将会变为标准的竖屏显示,对于调试Android 3.0平板来说控制模拟器的横竖屏还是很重要的。

方法二:

这种方法通过Linux Shell的方式,我们将一个Android设备通过USB连接到PC上,执行adb shell命令执行真机上的Linux Shell比如:

1. 切换为横屏执行 adb shell service call window 2013 i32 0

2. 切换为竖屏执行  adb shell service call window 2013 i32 1

这种方法可以看到其实对windows这个service执行相应的指令和参数,不过没有经过测试,可能在模拟器或Root过的真机上有效。
--------------------------------------
Android横竖屏切换时不销毁当前Activity

  我们大家都会出现这样一个毛病,在编写android的应用的时候,当推开手机的实体键盘时,当屏幕由竖屏转换为横屏,我们应用程序的界面(activity)就会没销毁,这个是编写应用的大忌,那我们要怎么样才能不让activity销毁那。下面我们就来说说,解决的办法:

                解决办法:

                首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性

Java代码:
<activity android:name=".FileBrowser"

android:label="@string/app_name"

android:configChanges="orientation|keyboardHidden"
//这句话很重要

>

<intent-filter>

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>
复制代码
                加入这条属性的含义是,应用程序将会处理屏幕方向和键盘状态(推出或合上)信息的改动。但对于其他的设备配置信息的改动则会由Android系统来处理(销毁当前Activity,然后重启一个新的Activity实例)。

                 那么,现在还需要在java代码的activity子类中加入配置信息改动的处理代码。这个也很简单。

Java代码:


/**

*

* 当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时,

* 并且如果此时有activity正在运行,系统会调用这个函数。

* 注意:onConfigurationChanged只会监测应用程序在AnroidMainifest.xml中通过

* android:configChanges="xxxx"指定的配置类型的改动;

* 而对于其他配置的更改,则系统会onDestroy()当前Activity,然后重启一个新的Activity实例。

*/

@Override
public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

// 检测屏幕的方向:纵向或横向

if (this.getResources().getConfiguration().orientation

== Configuration.ORIENTATION_LANDSCAPE) {

//当前为横屏, 在此处添加额外的处理代码

}

else if (this.getResources().getConfiguration().orientation

== Configuration.ORIENTATION_PORTRAIT) {

//当前为竖屏, 在此处添加额外的处理代码

}




//检测实体键盘的状态:推出或者合上



if (newConfig.hardKeyboardHidden

== Configuration.HARDKEYBOARDHIDDEN_NO){

//实体键盘处于推出状态,在此处添加额外的处理代码

}

else if (newConfig.hardKeyboardHidden

== Configuration.HARDKEYBOARDHIDDEN_YES){

//实体键盘处于合上状态,在此处添加额外的处理代码

}

}
复制代码

                 别忘了在java文件中加上import android.content.res.Configuration。这样就OK了,屏幕方向改变时,应用程序的显示界面也会随着改动,而不是被销毁!
---------------------------
默认横竖屏转换是会把你的Activity关掉重新启动的,但你可以在你的manifest里面设置Activity的属性configChanges来自己处理,也可以在手机横竖屏转换的时候来加载不同的UI layout。
<activity android:name=".RadioPlayer" ....   
    android:configChanges="orientation|keyboardHidden|navigation" >  
    ...  
    </activity> 
复制代码
然后在onConfigurationChanged来处理加载不同的layout。
public void onConfigurationChanged(Configuration newConfig){  
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){  
        setContentView(R.layout.landscape);  
    }else{  
        setContentView(R.layout.portrait);  
    }     

复制代码

---------------------------------
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tang_jiajia/archive/2010/02/24/5320185.aspx

在开发游戏的时候,有些 游戏是只能横屏玩的,所以手机竖立放置的时候,要保持游戏画面依然横屏。要做到这个要求其实很简单,在AndroidManifest.xml里面配置一下就可以了。加入这一行android :screenOrientation="landscape"。

例如(landscape是横向,portrait是纵向):

<?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的时候载入配置,那样,进行中的游戏就不会自动重启了!

--------------
求助:在应用程序的“菜单”中的“设置”里设置横竖屏切换,怎么应用到整个应用程序中?

整了半天终于整出来了,虽然不是最好的,也可能会麻烦一点,但是还是拿出来与大家分享一下,希望能给出宝贵的意见...
先看代码
这是菜单中“设置”中的部分代码,用到了SharedPreferences存储类(下面的share即是其对象)
//监听及横竖屏切换
                autoBtn.setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                                share = getSharedPreferences(SettingParameters.screenMode, 0);
                                share.edit().putInt(SettingParameters.screenStyle,
                                                ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED).commit();
                        }
                });
                verBtn.setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                                share = getSharedPreferences(SettingParameters.screenMode, 0);
                                share.edit().putInt(SettingParameters.screenStyle,
                                                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT).commit();
                        }
                });
                horBtn.setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                                share = getSharedPreferences(SettingParameters.screenMode, 0);
                                share.edit().putInt(SettingParameters.screenStyle,
                                                ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE).commit();
                        }
                });

下面这是一个提供设置中存储数据时的参数的类
public class SettingParameters extends Activity{
   
        public static final String screenMode = "screenMode";//存取横竖屏存储的字符串名字
        public static final String screenStyle = "screenStyle";//存取横屏或竖屏的字符串名

   //实现横竖屏切换的方法(是一个静态方法可以直接在其他activity里调用)
        public static  void screenMode(int screenOrientation, Context context) {
                if (screenOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
                       
                        ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                }
                else if (screenOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
                       
                        ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                       
                } else if(screenOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
                        ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                }
        }
}

下面这段代码是其他要实现这一功能的activity里所需要的代码,很简单就两句:(放在onCreate(Bundle savedInstanceState)方法里)
share = getSharedPreferences(SettingParameters.screenMode, 0);    SettingParameters.screenMode(share.getInt(SettingParameters.screenStyle, 0), this);

--------------------
搞开发有一阵子了,越来越能体会到上面那句话的真谛。
言归正传,最近在研究横竖屏切换的问题,统计了下,大家的解决办法是:
①不理会。。
②只竖屏显示(android:screenOrientation="portrait")
   只横屏显示(android:screenOrientation="landscape")
③简单的防止重载:
   在 AndroidManifest.xml中加入:android:configChanges="orientation|keyboardHidden"
   在activity中重载onConfigurationChanged事件
    @Override
    public void onConfigurationChanged(Configuration config) {
        super.onConfigurationChanged(config);
    }
复制代码
④横竖屏分别布局
论坛上也有很多讲解这部分的,但像我这样的新手还是一头雾水,今看到guoen的一篇文章,真是豁然开朗,遂分享之~
横竖屏分别布局的方法是:
在res下新建
layout-land 横屏
layout-port 竖屏
然后把layout中的xml文件分别考到以上目录,修改下布局就可以了代码中不做任何更改。
在 AndroidManifest.xml文件中的 主Activity中加入
android:configChanges="orientation|keyboardHidden"
复制代码
然后在主Activity中的onConfigurationChanged加入
@Override
        public void onConfigurationChanged(Configuration config) {
                super.onConfigurationChanged(config);

                if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
                        setContentView(R.layout.main);  //布局
                        tv = (TextView) findViewById(R.id.EditText01); //控件
                }

                if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                        setContentView(R.layout.main);  //布局
                        tv = (TextView) findViewById(R.id.EditText01);  //控件
                }
        }
复制代码

----------------
在编写android小应用的时候,碰到了这样的一个问题:当推开手机的实体键盘时,屏幕由竖屏转换为横屏,此时应用程序的显示界面(Activity)就会被销毁了,这个让人比较郁闷。

如何才能让这个activity不被销毁呢?

通过上面资料的阅读,解决办法就很简单了。

首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性

        <activity android:name=".FileBrowser"
                  android:label="@string/app_name"
                  android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
加入这条属性的含义是,应用程序将会处理屏幕方向和键盘状态(推出或合上)信息的改动。但对于其他的设备配置信息的改动则会由Android系统来处理(销毁当前Activity,然后重启一个新的Activity实例)。

那么,现在还需要在java代码的activity子类中加入配置信息改动的处理代码。这个也很简单

        /**
         * onConfigurationChanged
         * the package:android.content.res.Configuration.
         * @param newConfig, The new device configuration.
         * 当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时,
         * 并且如果此时有activity正在运行,系统会调用这个函数。
         * 注意:onConfigurationChanged只会监测应用程序在AnroidMainifest.xml中通过
         * android:configChanges="xxxx"指定的配置类型的改动;
         * 而对于其他配置的更改,则系统会onDestroy()当前Activity,然后重启一个新的Activity实例。
         */
        @Override
        public void onConfigurationChanged(Configuration newConfig) {       
                super.onConfigurationChanged(newConfig);
                // 检测屏幕的方向:纵向或横向
                if (this.getResources().getConfiguration().orientation
                                == Configuration.ORIENTATION_LANDSCAPE) {
                        //当前为横屏, 在此处添加额外的处理代码
                }
                else if (this.getResources().getConfiguration().orientation
                                == Configuration.ORIENTATION_PORTRAIT) {
                        //当前为竖屏, 在此处添加额外的处理代码
                }
                //检测实体键盘的状态:推出或者合上   
                if (newConfig.hardKeyboardHidden
                                == Configuration.HARDKEYBOARDHIDDEN_NO){
                        //实体键盘处于推出状态,在此处添加额外的处理代码
                }
                else if (newConfig.hardKeyboardHidden
                                == Configuration.HARDKEYBOARDHIDDEN_YES){
                        //实体键盘处于合上状态,在此处添加额外的处理代码
                }
        }
别忘了在java文件中加上import android.content.res.Configuration。
这样就OK了,屏幕方向改变时,应用程序的显示界面也会随着改动,而不是被销毁!

-----------------------------------还是分割线---------------------------------------------

扩展补充:

Activity中还有一属性和屏幕方向有关:


<activity
   . . .
      android:screenOrientation=["unspecified" | "user" | "behind" |
                                 "landscape" | "portrait" |
                                 "sensor" | "nosensor"]
    . . .
</activity>
比如,在Mainifest.xml的Activity元素中增加这么一个属性:

android:screenOrientation="portrait"

则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。

android:screenOrientation="landscape",为横屏显示。

这里提一个小知识,Anroid模拟器中,快捷键"ctrl+F11"可以实现转屏。

//------  背景

    在Android中 如果发生了横竖屏的切换 在默认的设置下是十分悲剧的 因为他会销毁你的Activity 再重新调用onCreate方法生成这个Activity 若是我们有动画在播放 就会重新播放 如果我们有表格正在填写 就必须要重填 因而 屏蔽横竖屏切换或者防止Activity的销毁就显得格外重要

    在网上看了太多帖子 都不是很清楚嘛 折腾了我一个晚上才研究明白 发篇日志以分享以备忘



//------  第一步:获得许可

    需要在中添加相应许可<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>



//------ 第二步:根据不同的目标,针对Activity进行设置

    目标1:屏蔽横竖屏的切换

    步骤:为Activity设置一个默认的屏幕方向 方法如下:

             在AndroidManifest.xml中找到该Activity 添加代码:

             <activity
                      android:name=".ActivityName"
                      android:screenOrientation="landscape"
                      >

               设置Activity的默认方向为“横向”

               此处的screenOrientation有如下选项:

               ==================================================================

               = unspecified                            默认值,由系统判断状态自动切换                                      

               = landscape                             横屏                                                    

               = portrait                                  竖屏                                  

               = user                                      用户当前设置的orientation值                                 

               = behind                                  下一个要显示的Activity的orientation值    

               = sensor                                  使用传感器 传感器的方向

               = nosensor                              不使用传感器 基本等同于unspecified

               ==================================================================



    目标2:防止Activity的销毁

    步骤:为Activity设置configChanges属性

             在AndroidManifest.xml中找到该Activity 添加代码:

             <activity
                      android:name=".ActivityName"
                      android:configChanges="orientation|keyboardHidden"

                      >

               此处的configChanges有如下选项:

               ==================================================================

               = orientation                             屏幕在纵向和横向间旋转                                      

               = keyboardHidden                    键盘显示或隐藏                                                  

               = fontScale                               用户变更了首选的字体大小                             

               = locale                                     用户选择了不同的语言设定                                

               = keyboard                                键盘类型变更,例如手机从12键盘切换到全键盘    

               = touchscreen或navigation       键盘或导航方式变化,一般不会发生这样的事件

               ==================================================================

               如果需要多个选项 用"|"隔开

               此处注意:如果是在实体机上测试横竖屏切换 需要orientation选项

                               【重点!】如果要使得程序可以在Android模拟器上测试 需要写orientation|keyboardHidden

                                                如果缺少了keyboardHidden选项 不能防止Activity的销毁

                                                并且在之后提到的onConfigurationChanged事件中 只能捕获竖屏变横屏的事件 不能捕获横屏变竖屏



    目标3:捕获横竖屏切换的事件

    步骤:在Activity中(ActivityName.java)重写onConfigurationChanged事件

                 @Override
              public void onConfigurationChanged(Configuration newConfig) {
               // TODO Auto-generated method stub
                  super.onConfigurationChanged(newConfig); 
               switch (newConfig.orientation)  
                  {  
                     //更改为LANDSCAPE
                     case (Configuration.ORIENTATION_LANDSCAPE): 
                          //如果转换为横向屏时,有要做的事,请写在这里

                           break;  
                     //更改为PORTRAIT
                     case (Configuration.ORIENTATION_PORTRAIT):  
                          //如果转换为竖向屏时,有要做的事,请写在这里

                           break;  


                  }
              }
--------------------
曾经遇到过一个面试题,让你写出横屏切换竖屏Activity的生命周期。现在给大家分析一下他切换时具体的生命周期是怎么样的:

1、新建一个Activity,并把各个生命周期打印出来

2、运行Activity,得到如下信息

onCreate-->
onStart-->
onResume-->

3、按crtl+f12切换成横屏时

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

4、再按crtl+f12切换成竖屏时,发现打印了两次相同的log

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

5、修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation",执行步骤3

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

6、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onConfigurationChanged-->

7、把步骤5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",执行步骤3,就只打印onConfigChanged

onConfigurationChanged-->

8、执行步骤4

onConfigurationChanged-->
onConfigurationChanged-->

总结:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法




总结一下整个Activity的生命周期

补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变

Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop       onRestart -->onStart--->onResume

Activity未被完全覆盖只是失去焦点:onPause--->onResume
关于android图片widget横竖屏切换时的问题
我想在一个Activity里面放一张很大的图片,点击后进入另外一个Activity,在不切换横竖屏时一切正常,在横竖屏切换的时候程序就很容易报异常,强行关闭。查看LOG显示Unable to start activity Componentinfo 以及XML文件内容错误。不知道什么原因,请教高人指点。
图片大小804K
分辨率1754×2480
是图片太大的缘故吗?有什么办法可以解决?

xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <ImageView android:id="@+id/ImageView01" android:src="@drawable/originalimg"
   android:layout_width="wrap_content" android:layout_height="wrap_content"/>  
</LinearLayout>
</HorizontalScrollView>
</ScrollView>
activity 定义如下:
package com.escarpbc.demo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
public class ActivityMain extends Activity {
/** Called when the activity is first created. */
private static final int SHOW_PARAGRAPH = 0;
private ImageView imgv;
private OnClickListener listener1;
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  listener1 = new OnClickListener() {
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent1 = new Intent(ActivityMain.this, ListTest.class);
    startActivityForResult(intent1, SHOW_PARAGRAPH);
   }
  };
  imgv = (ImageView) findViewById(R.id.ImageView01);
  imgv.setOnClickListener(listener1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
   Intent intent) {
  super.onActivityResult(requestCode, resultCode, intent);
}
}

为activity加上标签:
android:configChanges = "orientation|keyboardHidden"
试试呢
-----
widget中自动横竖屏切换时的问题
各位大大,有什么方法能获取到屏幕切换的事件?请教高人指点,现在我每次切换屏幕方向后,所有的东西都不跑了。onUpdate也不跑了。。真没办法了。。
--
这个问题解决了,虽然不知道造成问题的具体原因,不过总算解决了。
问题是因为在onReceive (Context context, Intent intent)函数中,用
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
   AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
   ComponentName thisWidget = new ComponentName(context,Act_Lastfm.class);
   appWidgetManager.updateAppWidget(thisWidget, views);
刷新了屏幕,导致widget丢失掉,所以就把所有的刷新动作都放到onUpdate()函数最后去做,onReceive()函数中接受到广播后的所有的操作,都存放到数据库中去,然后发送UPDATE的广播给自己。widget就会自动调用onUpdate()函数,进行刷新。这样就没问题了。


还是刷新屏幕的老问题,又出现了。。我的widget有4个TextView,现在想做的效果是我选中的TextView会变红。

首先设置了对第一个TextView的监听:

mIntent_Click_Row1  = new Intent("nicdy.widget.layouta.CLICK_ROW1");
mPIntent_Click_Row1 = PendingIntent.getBroadcast(context, 0, mIntent_Click_Row1, 0);
views.setOnClickPendingIntent(R.id.row1, mPIntent_Click_Row1);


public void onReceive (Context context, Intent intent) {
                super.onReceive(context, intent);
                String action = intent.getAction();
if (action.equals("nicdy.widget.layouta.CLICK_ROW1")) {
        //设置当前选中的行ID为0,存入数据库
        BaseData mBaseData = new BaseData( context, "Main.db", 1 );
        mBaseData.UpdateWidgetState("0");                       
        mBaseData.CloseDB();
        //发送UPDATE广播
        Intent mIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        context.sendBroadcast(g_mIntent);
}else if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {

         Bundle extras = intent.getExtras();
                if (extras != null) {
                    int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
                    if (appWidgetIds != null && appWidgetIds.length > 0) {
                            g_mIntent = intent;
                        this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
                       
                    }
                }
}
每次按下第一行,进到AppWidgetManager.ACTION_APPWIDGET_UPDATE里的时候extras 总是为null,这个怎么解决呢?

正确。哈哈,最后是看了music的widget的源码,发现原来它用了2个刷新,如果id存在就用updateAppWidget(int[] appWidgetIds, RemoteViews views) 刷新,如果ID不存在就用的updateAppWidget(ComponentName provider, RemoteViews views)  ,跟着它的写法。在onUpdate函数中检测int[] appWidgetids,如果为NULL,就用第2个函数刷新就OK了。。。.这个函数Set the RemoteViews to use for all AppWidget instances for the supplied AppWidget provider。问题暂时得到解决。。

----------
我是在修改launcher的时候出现的这个问题: launcher下面有两个配置文件夹一个是layout_land下面有个launcher.xml ,第二个是layout_port 下面也有个launcher.xml 但是我做横竖屏的时候横屏是获取的是layout_land下面的那个launcher.xml  当变成竖屏的时候还是获取的是launcher.xml   请问一下各位高手这是怎么回事, 有没有什么办法分别获取两个xml  (横屏的时候获取layout_land下面的launcher.xml , 竖屏的时候获取 layout_port下面的launcher.xml)

横竖屏的文件夹是layout-land、layout-port
以下来自网络

android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的OnCreate中来检查当前的方向,然后可以让你的SetContentView来载入不同的Layout xml.

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

Log.i("info", "landscape");

}

else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

Log.i("info", "portrait");

}

关于屏幕切换的时候
首先需要在androidmanifest.xml中加入配置
android:configChanges="orientation|keyboardHidden|navigation
这样在程序中. Activity就不会重复的调用onCreate()
甚至不会调用onPause.onResume.
只会调用一个onConfigurationChanged(Configuration newConfig)
这是在XML加入配置选项的前提下.

如果在就加入选项的前提下.如上所说. Activity会重新激活onCreate方法
----
       在浏览320*480(和屏幕大小一致)的图片时,第一次的竖转横时,出现图片没变化的情况,但第二次后就正常了。其他分辨率的没出现上叙情况。看了几天的代码只跟到onLayout在转换时在调用,但没有发现320*480的图片发什么会出现这中情况。请问大家有想法没?有知道横竖切换时,android框架中实现这一动作的过程是怎样的?
        3Q!
回答:;
可以在androidMainfest.xml里面配置android:screenOrientation来设置屏幕显示方式
也可以通过定义android:configChanges="orientation|keyboardHidden|navigation"
覆写onConfigurationChanged方法来定义屏幕切换时的动作
--
//      根据当前的画面,若为竖排则更改为横排
///*               
//        if(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
//        {
//                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//        }
如果有大量的图片需要绘制时建议不使用!

--
默认情况下(竖屏)是调用res/layout 中的布局,如果要自定义横屏时的布局,可以在res/目录下新建一个layout-land 文件,在这个文件夹中放置横屏的布局,横竖屏的XML 文件的名字必须一样。=====
layout-port和layout-land

-----
在activity中做判断,代码如下:
Configuration newConfig = getResources().getConfiguration();" w/ j4 `: ]5 S0 ~) \/ D+ |
   if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
//横屏时
setContentView(R.id.landscape);
}else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
//竖屏时
setContentView(R.id.portrait);( o) y' l/ e3 \& \2 u
}6 e( c8
=======
-------


分享到:
评论

相关推荐

    android 二维码扫描 支持横竖屏切换Demo

    本Demo主要展示了如何利用zxing库实现一个支持横竖屏切换的二维码扫描功能。ZXing,全称Zebra Crossing,是一个开源的条码处理库,支持多种格式的条码和二维码扫描。 首先,我们需要在项目中集成zxing库。这里使用...

    Android应用源码之(横竖屏切换处理).zip

    通过深入理解以上知识点,并参考“3-12-6(横竖屏切换处理)”的源码,开发者可以更好地处理Android应用中的横竖屏切换问题,实现流畅、无中断的用户体验。同时,源码示例提供了实践操作的机会,有助于加深理论知识的...

    安卓 横竖屏切换源程序

    三、处理横竖屏切换的生命周期问题 当Activity因横竖屏切换而重建时,其生命周期方法会被调用。为了确保数据不丢失,我们需要在`onSaveInstanceState()`中保存关键数据,并在`onCreate()`或`onRestoreInstanceState...

    Android视频播放器(支持横竖屏切换)

    在Android平台上开发一款支持横竖屏切换的视频播放器是一项常见的任务,这涉及到对Android多媒体框架的深入理解和屏幕适配策略。"Android视频播放器(支持横竖屏切换)"这个项目的核心目标是创建一个能够根据设备...

    Android应用源码之(横竖屏切换处理-IT计算机-毕业设计.zip

    这份"Android应用源码之(横竖屏切换处理)"的资源,是一个非常适合毕业设计学习的示例,可以帮助开发者深入理解如何在Android应用中处理屏幕旋转的问题。 首先,Android系统默认支持横竖屏的自动切换,但有时为了...

    surfaceview 支持横竖屏切换 视屏适配屏幕

    在处理视频播放时,特别是涉及横竖屏切换和屏幕适配时,开发者需要考虑多个关键点以确保良好的用户体验。 首先,SurfaceView在横竖屏切换时的处理至关重要。当设备旋转时,Android系统会销毁当前的Activity并重新...

    android安卓横竖屏切换效果、webview加载以及生命周期监测

    在Android开发中,横竖屏切换是常见的应用场景,它涉及到Activity的生命周期管理和用户界面的适配。本项目“LandscapePortraitDemo”旨在演示如何在Android Studio中处理这一问题,同时结合WebView的加载以及...

    Android横竖屏切换处理Demo源码.rar

    这份"Android横竖屏切换处理Demo源码"提供了一个很好的学习示例,帮助开发者理解和处理这一问题。以下是对这个Demo源码中涉及的知识点的详细解析: 1. **Activity生命周期与横竖屏切换**: 当设备屏幕方向发生变化...

    ipad横竖屏切换解决方案

    在 iPad 开发中,横竖屏切换是一个常见的问题,因为 iPad 的横竖屏不同,好的应用程序需要根据屏幕方向来调整页面布局。解决这个问题需要一个整体的解决方案。 首先,我们需要了解 iPad 的屏幕方向。iPad 的屏幕...

    Android中WebView播放网上视频,横竖屏切换

    然而,实现这样的功能并不总是那么简单,尤其是在处理屏幕旋转(横竖屏切换)时可能会遇到问题。下面我们将详细讨论如何在Android的WebView中播放网上视频,并处理横竖屏切换。 首先,我们需要了解WebView的基本...

    解决Android手机屏幕横竖屏切换

    ### 解决Android手机屏幕横竖屏切换问题 在Android应用开发中,屏幕方向的变化是一个常见的需求,也是开发者经常需要处理的问题。当用户旋转设备时,Android系统默认会重启Activity,导致用户界面状态丢失,用户...

    二维码扫描修改横竖屏切换后的好用代码

    标题提到的"二维码扫描修改横竖屏切换后的好用代码"主要关注的是如何在屏幕旋转时保持二维码扫描功能的稳定性和用户体验。以下是一些相关的关键知识点: 1. **二维码扫描库**:在Android中,常用的二维码扫描库有...

    Android之横竖屏切换

    Android 横竖屏切换是手机开发中一个非常常见的问题,很多软件在开发过程中为了避免横竖屏切换时引发不必要的麻烦,通常禁止掉横竖屏的切换,即通过在 AndroidManifest.xml 中设置 activity 中的 android:...

    android横竖屏切换总结

    在Android应用开发中,横竖屏切换是一个常见的需求,开发者需要处理好布局的变化以及由此引发的用户体验问题。本文将详细讲解如何在Android中实现横竖屏切换,并讨论如何禁止或控制这种切换。 首先,Android系统...

    android 横竖屏切换的处理

    在Android开发中,横竖屏切换是常见的场景,它涉及到用户界面布局的动态调整和应用程序状态的保存与恢复。为了确保应用在横竖屏切换时能够流畅地展示并保持用户体验,开发者需要掌握一些关键知识点。 首先,Android...

    支持横竖屏切换的视频播放器demo

    在iOS开发中,创建一个支持横竖屏切换的视频播放器是常见的需求,尤其是在开发多媒体应用或者需要视频功能的应用时。这个"支持横竖屏切换的视频播放器demo"就是一个典型的示例,它展示了如何利用苹果系统播放器来...

    Android横竖屏切换及其对应布局加载问题详解

    在Android应用开发中,横竖屏切换是一个常见的需求,但同时也可能带来布局加载的问题。本文主要探讨了如何处理横竖屏切换以及对应的布局加载策略。 首先,横竖屏切换会导致界面布局的变化,因为横屏和竖屏的屏幕...

    横竖屏之间切换

    总的来说,处理横竖屏切换涉及对Android Activity生命周期的理解、布局的适应性设计、状态保存和恢复,以及对数据加载策略的考虑。熟练掌握这些技巧将有助于构建健壮且用户体验优秀的Android应用。

Global site tag (gtag.js) - Google Analytics