android:layout_weight不会在方向更改时从正确的布局中选取值

时间:2014-05-22 08:04:20

标签: android android-layout android-orientation android-layout-weight

我有一个LinearLayout,它包含一个Fragment和一个FrameLayout。我想对它们使用layout_weight,因为我希望Fragment只占用屏幕的一小部分,而FrameLayout应该占据屏幕的更大部分。我希望layout_weight只应用于宽度部分而不是高度。我还希望在平板电脑的方向发生变化时更改layout_weight。对于Eg。当它处于纵向模式时,我希望Fragment占据屏幕空间的3/10,FrameLayout占据7/10,而在Landscape模式下,我希望Fragment占据屏幕空间的2/10,FrameLayout占用8 /屏幕空间的第10个。

我有两种不同的横向和纵向模式布局,但它不起作用。我不确定这里的错误是什么: - (

布局大土地\ frame_main_activity.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="horizontal"
    android:weightSum="10"
    android:paddingTop="10dip"
    android:paddingBottom="10dip"
    android:paddingRight="10dip" >

    <!-- This fragment takes the left area fixed for menu -->

    <fragment
        android:id="@+id/left_pane_fragment"
        android:name="MenuFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

    <!-- A place holder which is filled by relevant content later -->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="8"
        android:background="#FFFFFF" />
</LinearLayout>

布局大端口\ frame_main_activity.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="horizontal"
    android:weightSum="10"
    android:paddingTop="10dip"
    android:paddingBottom="10dip"
    android:paddingRight="10dip" >

    <!-- This fragment takes the left area fixed for menu -->

    <fragment
        android:id="@+id/left_pane_fragment"
        android:name="MenuFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3" />

    <!-- A place holder which is filled by relevant content later -->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="7"
        android:background="#FFFFFF" />
</LinearLayout>

问题在于,它为两个方向选择了layout_weight中的任何一个,并且在方向更改时不更新layout_weight。 例如,在上述情况下,它只会为横向和纵向模式选择2,8的layout_weight,并且不会根据方向更改来更新它。

我不确定这里出了什么问题。我已经检查了各种教程,并在各种论坛上尝试了很多东西,但找不到任何可以解决问题的东西。

2 个答案:

答案 0 :(得分:3)

因此,我找到的针对预期行为的正确解决方案是以编程方式处理方向更改。

在我的活动的 onConfigurationChanged 中,我有以下代码: -

// Checks the orientation of the screen
View leftPaneFragment = findViewById(R.id.left_pane_fragment);
View contentFrame = findViewById(R.id.content_frame);

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
leftPaneFragment.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT, 8f));
contentFrame.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT, 2f));
}
else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
leftPaneFragment.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT, 7f));
contentFrame.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT, 3f));
}

此外,我还在AndroidManifest.xml中添加了以下内容: -

android:configChanges="orientation|screenLayout|screenSize"

列出活动将自行处理的配置更改。在运行时发生配置更改时,默认情况下会关闭并重新启动活动,但声明具有此属性的配置将阻止活动重新启动。相反,活动仍在运行,并调用其onConfigurationChanged()方法。

参考文献: - http://developer.android.com/guide/topics/manifest/activity-element.html http://developer.android.com/guide/topics/resources/runtime-changes.html

答案 1 :(得分:0)

确保您未在​​AndroidManifest.xml中的调用活动中添加属性 android:configChanges =“orientation | screenLayout | screenSize”