【问题标题】:how to provide separate layouts for portrait and landscape mode in android如何在android中为纵向和横向模式提供单独的布局
【发布时间】:2011-12-06 20:39:53
【问题描述】:

我正在使用一个实时应用程序,它在整个应用程序中都包含选项卡。当我尝试在纵向和横向之间切换方向时,我有代码来显示单独的横向布局。为此,我使用了onConfigurationChanged 方法如下

public void onConfigurationChanged(Configuration newConfig) {

    super.onConfigurationChanged(newConfig);
    if(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
        setContentView(R.layout.eventslist);
    }else if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
        setContentView(R.layout.eventstimeline);
    }
}

在该特定活动的清单文件中,我使用了如下两个属性

android:screenOrientation="sensor"

android:configChanges="orientation|keyboardHidden"

但是当我旋转设备时,我看不到我在onConfigurationChanged 中指定的横向模式的单独布局。另外我不想在横向模式下看到标签。对此有任何想法。

【问题讨论】:

  • 您的设备是否可能无法检测到方向变化?在 OrientationEventListener 上有一个方法:canDetectOrientation()

标签: android


【解决方案1】:

在资源中,您可以为每个方向定义不同的布局,类似于具有屏幕密度的可绘制对象。

除了layout文件夹,您还可以将布局放入:

layout-port:纵向布局

layout-land:横向布局

当然,您应该为这些布局使用相同的名称,与可绘制对象相同。

然后只需 setContentView(R.layout.thatlayout);

【讨论】:

  • 更多解释here关于如何做到这一点。
【解决方案2】:

如果您不关心在更改方向时会重新创建活动,只需为具有相同名称的纵向和横向创建布局 xml 文件,并将用于纵向的文件放在布局文件夹中,将用于横向的文件放在布局文件夹中-土地文件夹。 然后就可以了

protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.xml_with_same_name_for_landscape_and_portait);
}

如果您不想在每次方向更改时都重新创建活动,那么您似乎做得很好,但是 Activity doc 说:

但是,如果配置更改涉及您未处理的任何内容,则该活动仍将重新启动,并且不会调用 onConfigurationChanged(Configuration)。

所以你的问题是永远不会调用 onConfigurationChanged()。在这种情况下,请检查清单中的 android:configChanges 属性。

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多