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

时间:2011-07-27 15:35:03

标签: android android-layout android-linearlayout relativelayout

我有两个布局,一个用于肖像,一个用于风景。对于肖像我有它在布局文件夹下和横向我在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(); 
    }
}

错误发生在loadMBIIntoView方法中,代码如下

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

横向布局本身没有rlMain布局,但肖像却没有。如果重新启动活动(这对我很好),每次更改屏幕模式时都不应自动加载相应的布局?我将不胜感激任何帮助。谢谢。

更新:02:00 PM

我添加了代码,但仍然会出现同样的错误。由于将线性布局转换为相对布局而出现错误,这就是问题所在。纵向布局(“main.xml”)位于其默认的“布局”文件夹中。此布局具有相对布局(“rlmain”)。横向布局(“main.xml”)位于layout-land文件夹中。此main.xml具有不同的UI规范并具有线性布局。默认情况下,我加载纵向模式,它加载正常,我按Ctrl + F11将其更改为横向,布局 - 土地文件夹中的布局加载正常。然后我再次按Ctrl + F11更改为Portrait,其中默认布局文件夹中的main.xml应该已加载但未加载,这就是我收到大小写异常的原因。

3 个答案:

答案 0 :(得分:1)

您似乎正在尝试将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进入“{3}}所述的”下一个布局方向“。因此,当您按F11两次时,您不会返回原始方向。您正在切换到颠倒的肖像模式。

第一次尝试按F11,然后第二次按F12,这样仿真器确实会返回到真正的原始状态,看看是否仍会导致错误。

编辑#2:

这似乎是模拟器旋转的问题here。 可以找到与此问题类似的问题(possibly a bug)

本质上,模拟器会进行额外的生命周期调用,而实际设备则不会。据说它模拟here的旋转,而不是通过加速度计模拟真实设备。

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

答案 1 :(得分:0)

我也遇到了同样的问题。它解决了。它的主要问题是当您从横向切换到纵向时,活动不会刷新。你可以做一件事,覆盖onConfigurationChanged并像这样实现。它将刷新活动。

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

}

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

答案 2 :(得分:0)

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

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

在代码中使用这些行进行方向更改

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

另请注意在<" setContentView">之后设置方向。如

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