【问题标题】:Android layout with different items on landscape and on portrait横向和纵向具有不同项目的 Android 布局
【发布时间】: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?

【问题讨论】:

    标签: android landscape screen-orientation portrait


    【解决方案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。

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多