MyException - 我的异常网
当前位置:我的异常网» 移动开发 » 横竖屏切换有关问题

横竖屏切换有关问题

www.MyException.Cn  网友分享于:2013-06-29  浏览:398次
横竖屏切换问题
问题如下:


--------------------------
要解决的问题应该就两个:
一。布局问题;
二。重新载入问题。
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
=======
-------


文章评论

程序员都该阅读的书
程序员都该阅读的书
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
中美印日四国程序员比较
中美印日四国程序员比较
一个程序员的时间管理
一个程序员的时间管理
程序员和编码员之间的区别
程序员和编码员之间的区别
10个调试和排错的小建议
10个调试和排错的小建议
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Java程序员必看电影
Java程序员必看电影
代码女神横空出世
代码女神横空出世
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
我是如何打败拖延症的
我是如何打败拖延症的
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
那些争议最大的编程观点
那些争议最大的编程观点
编程语言是女人
编程语言是女人
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
总结2014中国互联网十大段子
总结2014中国互联网十大段子
 程序员的样子
程序员的样子
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
如何成为一名黑客
如何成为一名黑客
鲜为人知的编程真相
鲜为人知的编程真相
我的丈夫是个程序员
我的丈夫是个程序员
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
每天工作4小时的程序员
每天工作4小时的程序员
漫画:程序员的工作
漫画:程序员的工作
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员的鄙视链
程序员的鄙视链
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有