将布局从纵向切换到横向模式时出现问题

问题描述:

我有两个布局,一个用于横向肖像。对于纵向我有它在布局文件夹和景观下我有它在layout-land文件夹下。两者都具有相同的名称main.xml。切换从纵向到横向没有任何错误发生。同样,当我从横向切换到纵向时,出于某种原因,它不加载基于纵向的布局,无法找到我定义的根布局。下面是logcat的输出\将布局从纵向切换到横向模式时出现问题

07-27 15:25:09.601: WARN/System.err(278): java.lang.ClassCastException: android.widget.LinearLayout 
07-27 15:25:10.230: WARN/System.err(278):  at com.me2youmob.swagwrap.ChickenWrapActivity.loadMBIIntoView(ChickenWrapActivity.java:102) 
07-27 15:25:10.230: WARN/System.err(278):  at com.me2youmob.swagwrap.ChickenWrapActivity.onCreate(ChickenWrapActivity.java:41) 
07-27 15:25:10.230: WARN/System.err(278):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-27 15:25:10.250: WARN/System.err(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
07-27 15:25:10.250: WARN/System.err(278):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
07-27 15:25:10.250: WARN/System.err(278):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3815) 
07-27 15:25:10.311: WARN/System.err(278):  at android.app.ActivityThread.access$2400(ActivityThread.java:125) 
07-27 15:25:10.311: WARN/System.err(278):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2037) 
07-27 15:25:10.311: WARN/System.err(278):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-27 15:25:10.322: WARN/System.err(278):  at android.os.Looper.loop(Looper.java:123) 
07-27 15:25:10.322: WARN/System.err(278):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-27 15:25:10.329: WARN/System.err(278):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-27 15:25:10.329: WARN/System.err(278):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-27 15:25:10.361: WARN/System.err(278):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
07-27 15:25:10.361: WARN/System.err(278):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
07-27 15:25:10.371: WARN/System.err(278):  at dalvik.system.NativeStart.main(Native Method) 

这是存在的代码中的onCreate是如下

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);   
    int deviceRotation = getWindowManager().getDefaultDisplay().getRotation(); 
    Utils.spPreferences = getSharedPreferences(Utils.PREFS_NAME, 0); 
    if (deviceRotation == 1) 
    { 
     int imgID = Utils.getMbiIndex("mbiIndex"); 
     int drawBgId = Utils.getMbiDrawIndex(imgID); 
     try 
     { 
      ImageView ivLandView = (ImageView) findViewById(R.id.ivLandMbi); 
      ivLandView.setImageResource(drawBgId); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     }     
    } 
    else 
    { 
     loadMBIIntoView(); 
     handleButtonClicks(); 
    } 
} 

happenson其中代码如下

public void loadMBIIntoView() 
{ 
    int imgID = Utils.getMbiIndex("mbiIndex"); 
    int drawBgId = Utils.getMbiDrawIndex(imgID); 
    try { 
     RelativeLayout llMain = (RelativeLayout) findViewById(R.id.rlMain); 
     Resources res = getResources(); 
     Drawable drawMbi = res.getDrawable(drawBgId); 
     llMain.setBackgroundDrawable(drawMbi);   
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

的横向布局的loadMBIIntoView方法的错误没有rlMain布局本身,但肖像确实。如果活动正在重新启动(这对我来说很好),每当我更改屏幕模式时,不应该自动加载适当的布局?我将不胜感激任何帮助。谢谢。

更新:02:00 PM

我加入了代码,但它还是给了同样的错误。由于将线性布局转换为相对布局而导致错误消失,这就是问题所在。纵向布局(“main.xml”)位于其默认的“布局”文件夹中。该布局具有相对布局(“rlmain”)。横向布局(“main.xml”)驻留在layout-land文件夹中。这个main.xml具有不同的UI规范,并具有线性布局。默认情况下,我在纵向模式下加载它加载正常,我按下Ctrl + F11将其更改为横向,layout-land文件夹中的布局加载正常。然后我再次按下Ctrl + F11以更改为纵向,其中默认布局文件夹中的main.xml应该已加载,但未加载,这就是为什么我得到案例异常。

+0

景观文件不包含rlMain? Android会自动在布局和布局区域中切换布局,但不会创建不在那里的布局。如果rlMain不在横向文件中,findViewById(R.id.rlMain)将返回null,并且在尝试使用它时会出错。 – theisenp

+0

是的风景文件不包含rlMain。我已经将约束放在适当的位置,以便在激活横向模式时不调用rlMain。当我应该加载纵向布局并且应该能够找到rlMain时,我切换回纵向模式时出现错误。 – vikramjb

+0

明白了。那么ChickenWrapActivity的第102行是什么? – theisenp

看起来你正在试图将一个LinearLayout投射到一个RelativeLayout,但是这并没有什么意义,因为它最初在纵向模式下工作。这可能是你在onCreate()中的if语句的一个问题。当它不应该调用loadMBIIntoView()函数时可能会导致错误。

您可以测试deviceRotation == 1,但只捕捉设备旋转90度的情况,忽略旋转270度的情况。

试试这个,看看有什么变化:

if(deviceRotation == Surface.ROTATION_90 || deviceRotation == Surface.ROTATION_270) 
{ 
    ... 
} 
else 
{ 
    ... 
} 

Surface.ROTATION_90是预先定义的,等于1常数,Surface.ROTATION_270等于3

编辑:

我仍然认为这是你的deviceRotation的一个问题。 Ctrl + F11转到“上一个布局方向”,而Ctrl + F12转到here所述的“下一个布局方向”。所以当你按F11两次,你不会回到原来的方向。您正在切换到倒置的人像模式。

尝试按F11的第一时间,然后F12第二次,使模拟器确实返回到它是真实的原始状态,看看是否仍然会导致错误。

EDIT#2:

这似乎是与仿真器旋转的问题(possibly a bug)。 与此相似的问题可以在here找到。

本质上,模拟器会产生额外的生命周期调用,而实际的设备不会。假设它通过opening the keyboard来模拟旋转,而不是像实际设备那样通过加速计。

如果可以,我会在真实设备上测试您的代码,看看它是否是合法问题。现在看起来这只是模拟器的一个问题,你应该忽略它。

+0

我无法输入整个东西,所以我已经添加了更新到我原来的帖子。你的想法是正确的关于布局铸造,问题是错误的布局正在以纵向模式加载,我不知道为什么它发生这种方式。 – vikramjb

+0

更新了我的原始答案。 – theisenp

+0

工作:)谢谢。如果我按下Ctrl + F12它正在工作但是这是否意味着在手机上翻转设备时,布局会崩溃? – vikramjb

我也遇到了同样的问题。它解决了。它的主要问题是当你从风景切换到肖像时,活动不会令人耳目一新。你可以做一件事,重写onConfigurationChanged并像这样实现。它会刷新活动。

public void onConfigurationChanged(Configuration newConfig) { 
    // TODO Auto-generated method stub 
    super.onConfigurationChanged(newConfig); 
    startActivity(getIntent()); 
    finish(); 

} 

它会帮助你。如果您的问题得到解决,请回复。

将这些行AndroidManifest.xml添加到您想要定位的活动中。

机器人:configChanges = “取向| keyboardHidden |屏幕尺寸”

在代码使用这些线,用于取向变化

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

还要记住< “的setContentView” 后设置方向>为

的setContentView(R.layout.main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);