如何在旋转时更改布局?

时间:2017-08-15 05:39:01

标签: android android-layout

我在select TableA.CodeA Code, case when TableB.CodeB is null then 0 else 1 end Value from TableA left outer join TableB on TableA.CodeA = TableB.CodeB xmllayout-normal中有一个layout-large。我要做的是使用特定layout-land中提供的xml

我已经在这里搜索过,这就是我已经尝试过的。

1)我使用了不同的orientation名称但名称相同layout并覆盖ids并在其中设置onConfigurationChanged。这是我的代码

layout

确实发生了变化,但是当屏幕旋转时,@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { setContentView(R.layout.activity_login2); } if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { setContentView(R.layout.activity_login ); } } 中的输入数据消失了。我尝试使用EditText保存onSaveInstanceState但仍然相同。看起来它会破坏活动并创建一个新的活动,其中instance中初始化的所有窗口小部件都消失了。

2)然后我找到了onCreate,只是将景观布局放在那里,使用相同的布局名称,例如layout-landlayout-normal示例

layout-large

res/layout-land -> activity_login.xml

res/layout-normal-> activity_login.xml

并删除代码上的res/layout-large-> activity_login.xml但仍无法正常工作。

onConfigurationChanged AndroidManifest中,我提出了

LoginActivity

屏幕旋转时是否还要更改布局?先感谢您。

3 个答案:

答案 0 :(得分:2)

"屏幕尺寸"限定符的优先级高于" orientation"预选赛。 https://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources

  

Android支持多个配置限定符,您可以通过用破折号分隔每个限定符来将多个限定符添加到一个目录名称。表2按优先顺序列出了有效的配置限定符

假设您有这些文件:

res/
    layout-normal/
        layout.xml
    layout-land/
        layout.xml

如果你有一个普通的屏幕尺寸设备,无论你是使用肖像还是风景都无关紧要。始终会layout-normal选择layout-land

你可以通过两种不同的方式解决这个问题。

首先,你可以把你的"默认"普通layout目录中的布局(而不是layout-normal)。所以你的文件将是

res/
    layout/
        layout.xml
    layout-land/
        layout.xml

其次,您可以组合限定符,以便明确区分纵向和横向。所以你的文件将是

res/
    layout-normal/
        layout.xml
    layout-normal-land/
        layout.xml

答案 1 :(得分:1)

我认为您可能忽略了layout-land文件夹的要点。应该是这样的情况:当设备旋转到横向时,您在那里指定的任何布局(例如some_activity.xml)将自动使用。您可以将布局文件命名为potrait版本已使用的相同名称。布局文件本身也可以使用相同的ID来命名出现的各种小部件。

关于在旋转设备时丢失某些UI状态,您可能必须覆盖onSaveInstanceState(Bundle savedInstanceState)并在旋转发生时从UI保存一些状态。这并没有与显示哪个布局文件有关。

答案 2 :(得分:0)

首先,您不需要创建另一个.xml,例如activity_login2,您可以使用相同的activity_login.xml

Android有默认文件夹 / res / layout ,其中包含所有布局。因此,无论何时旋转设备,它都将使用相同的 activity_login.xml 文件。

您可以添加新文件夹/ res / layout-land,将 activity_login.xml 复制到其中并进行必要的调整。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        setContentView(R.layout.activity_login2); // it will use .xml from /res/layout
    }
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        setContentView(R.layout.activity_login); // it will use xml from /res/layout-land
    }
}