【问题标题】:Different layouts on orientation change方向变化的不同布局
【发布时间】:2011-09-19 04:44:18
【问题描述】:

我在 layout-land 和 layout-port 文件夹中有两个 main.xml 文件,当手机的方向改变时,它会强制重新加载 main.xml。

@Override
    public void onConfigurationChanged(Configuration configure){
        super.onConfigurationChanged(configure);
        setContentView(R.layout.main);

它在纵向模式下工作正常,但在横向模式下按下页面上的任何图像按钮都会导致应用崩溃。按下时,图像按钮都会将名为 grid 的图像更改为不同的图像。打开另一个页面的按钮在两种布局中都可以正常工作。这是代码示例。

final ImageView imageView = (ImageView)findViewById(R.id.grid);
// This is an imagebutton
findViewById(R.id.plank).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                imageView.setImageResource(R.drawable.gridplanks);
            }
    });
// This is a button that brings up a new page
      findViewById(R.id.mcg).setOnClickListener(new OnClickListener() {
             @Override
              public void onClick(View view) {
                 startActivity(new Intent("com.example.minecraftcraftingguide.MCG"));
                 }
});

这是你需要的吗?编程新手,抱歉。

>09-18 22:20:46.688: ERROR/AndroidRuntime(334): FATAL EXCEPTION: main
09-18 22:20:46.688: ERROR/AndroidRuntime(334): java.lang.NullPointerException
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at com.example.minecraftcraftingguide.Menu$1.onClick(Menu.java:27)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at android.view.View.performClick(View.java:2485)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at android.view.View$PerformClick.run(View.java:9080)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at android.os.Handler.handleCallback(Handler.java:587)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at android.os.Looper.loop(Looper.java:123)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at android.app.ActivityThread.main(ActivityThread.java:3683)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at java.lang.reflect.Method.invokeNative(Native Method)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at java.lang.reflect.Method.invoke(Method.java:507)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-18 22:20:46.688: ERROR/AndroidRuntime(334):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 我建议设置一些断点,在调试模式下运行它并查看崩溃的真正原因是什么。我很确定每次旋转设备时都会调用 onCreate,所以你应该做上面所做的所有工作。
  • 请显示 logcat 输出,您遇到了什么错误。谢谢。
  • 我的盲目猜测是你删除了这个 setContentView。它在那里不需要。按照此处的说明进行快速配置更改developer.android.com/resources/articles/…
  • 如果没有堆栈跟踪,将很难为您提供帮助。请在此处粘贴您的堆栈跟踪

标签: android android-layout


【解决方案1】:

您的默认布局文件夹中有 main.xml 还是只有 layout-port 和 layout-land 中的两个?

如果我是你,我会将文件从布局端口移动到你的默认布局文件夹。如果应用在横向文件夹中,则应用将使用 layout-land 中的文件,否则(如果应用处于纵向模式)将使用默认文件夹中的文件。

另一个提示:检查两个 xml 文件中的拼写。也许您在其中一个按钮 ID 中缺少一个字符。

【讨论】:

  • 我将landscape-port main.xml 移动到默认布局文件夹,但现在所有按钮都不能在横向中使用。该应用程序不会崩溃,它们只是没有功能。此外,它不会在方向更改时从横向切换回纵向。
  • 实际上,我发现横向模式下的 id 有拼写错误,而我之前评论的“卡在横向模式”问题显然是模拟器的一个已知问题。它现在似乎正在工作。谢谢!
【解决方案2】:

你必须在mainfest中声明ConfigChanges,并且你不需要在onOnfigurationChanged()方法中编写setcontentView(),事实上,在mainfest中声明后,你不需要在程序中写任何东西,android会自动获取位于 layout-land xml 文件中的横向 xml 文件。

因为每当你调用 setContentView() 时,你必须再次声明它的元素。!!!

只需在 mainfest 中提及,在此活动标签中 android:configChanges=keyboardHidden|orientation 要么 不要在你的 onConfigChanged() 方法中写任何东西

【讨论】:

  • 更改方向时不会更改 xml 文件。如果我以横向方式启动应用程序,它会加载横向文件,但如果我按下按钮,它仍然会崩溃。
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多