横向和纵向具有不同项目的 Android 布局

Posted

技术标签:

【中文标题】横向和纵向具有不同项目的 Android 布局【英文标题】:Android layout with different items on landscape and on portrait 【发布时间】:2011-10-26 11:24:41 【问题描述】:

我在 res/layout-land 和 res/layout 中有 main.xml。有一个由 12 个图标组成的网格,分别为 3 x 4(宽度、高度)。如果用户旋转到横向,我想在两页中以 3 x 2 和 3 x 2 的 ViewPager 显示它们。所以在 res/layout 中有一个包含 12 个项目的网格,在 res/layout-land 中有一个 ViewPager,我需要给它一个 PagerAdapter。

我的问题是:假设我正在使用 configChanges="orientation",我该怎么做?或者更具体地说,例如,我在哪里为 ViewPager 提供 PagerAdapter?

【问题讨论】:

【参考方案1】:
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

@Override
public void onConfigurationChanged(Configuration newConfig) 
    super.onConfigurationChanged(newConfig);
    if(display.getOrientation() == 0)
        setContentView(R.layout.main_portrait);
    else
        setContentView(R.layout.main_landscape); //getOrientation gives 1 here

【讨论】:

你会在上面的 if/else 语句中给出 View pager。 虽然我建议改为创建 res/values-land/integer.xmlres/values-port/integer.xml,这将允许您在同一布局 xml 中指定 <integer>s,而不是通过创建两个布局文件来复制功能。 那么你的意思是没有办法用 res/layout-land 和 res/layout 做到这一点? 我们是否认为这是唯一的方法?这似乎很令人困惑,对我来说很难相信没有办法为每个布局文件夹指定完全不同的小部件。如果是这种情况,那么布局文件夹仅用于重新定位小部件,而不是替换屏幕中的一组不同项目。不想反对你的答案,但我真的想检查一下。【参考方案2】:

您可以创建两个布局文件,并在 onCreate() 的开头(就在 super.onCreate(bundle) 行之后)在这一行周围放置一个 if/else 语句:

setContentView(R.layout.main);

看起来像这样:

if(orientation==LANDSCAPE)
    setContentView(R.layout.main_landscape);
else
    setContentView(R.layout.main_portrait);

从那时起,无论您的 java 代码有什么不同,只需将其包装在相同的条件下即可。如果您的 java 代码非常依赖于纵向,那就有点啰嗦了,但我想不出更好的解决方案 atm。

此外,根据您的应用程序及其功能,您可能需要在方向更改时重新创建活动。但同样,这可能没有必要。

希望对你有帮助

【讨论】:

以上是关于横向和纵向具有不同项目的 Android 布局的主要内容,如果未能解决你的问题,请参考以下文章

处理略有不同的纵向和横向布局的单个 Android 布局 xml 文件?

Android 纵向和横向布局

具有纵向和横向图像视图的自动布局

如何在不使用代码的情况下使用约束 AutoLayout 来指定横向与纵向的不同布局?

如何在颤动中显示横向和纵向的不同布局

播放 VideoView 的不同纵向和横向布局