【发布时间】:2011-10-14 09:31:24
【问题描述】:
我有两种布局,一种用于纵向,一种用于横向。对于纵向,我将它放在布局文件夹下,对于横向,我将它放在 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
我添加了代码,但它仍然给出相同的错误。由于将线性布局转换为相对布局,因此会出现错误,这就是问题所在。纵向布局(“main.xml”)位于其默认的“布局”文件夹中。此布局具有相对布局(“rlmain”)。横向布局(“main.xml”)位于 layout-land 文件夹中。这个 main.xml 有不同的 UI 规范,并且具有线性布局。默认情况下,我以纵向模式加载,加载正常,然后按 Ctrl + F11 将其更改为横向,layout-land 文件夹中的布局加载正常。然后我再次按 Ctrl + F11 更改为 Portrait,默认布局文件夹中的 main.xml 应该已加载但未加载,这就是我收到案例异常的原因。
【问题讨论】:
-
横向文件不包含rlMain? Android 会自动在 layout 和 layout-land 中的布局之间切换,但不会创建不存在的布局。如果 rlMain 不在横向文件中,findViewById(R.id.rlMain) 将返回 null 并且当您尝试使用它时会出现错误。
-
是的,横向文件不包含 rlMain。我已经设置了约束,以便在激活横向模式时不会调用 rlMain。当我切换回纵向模式时出现错误,它应该加载纵向布局并且应该能够找到 rlMain。
-
知道了。那么 ChickenWrapActivity 的第 102 行是什么?
-
布局文件夹中是否有横向和纵向的默认布局,而不仅仅是 layout-portrait 和 layout-landscape?如果您可以包含给出错误发生的确切行的堆栈跟踪,这也会有所帮助。
-
@theisenp,第 102 行正在尝试获取 rlMain 实例 RelativeLayout llMain = (RelativeLayout) findViewById(R.id.rlMain);
标签: android android-layout android-linearlayout android-relativelayout