如何在屏幕方向更改时重新加载具有新尺寸的片段

时间:2014-10-14 07:40:50

标签: android

我有一个片段,其中 TextView 从文件夹中获取它的宽度:

valuesvalues-port

当方向发生变化时,这些值会发生变化,但片段的用户界面不会产生任何影响。

实际上它实际上是从values-port

中选择值

如果设备处于横向模式:onConfigurationChanged()将调用新方向作为横向。

如果设备处于纵向模式:未调用onConfigurationChanged()。

当我改变方向时,肯定会调用onConfigurationChanged()

所以,

为什么它始终以纵向模式开始?

如何处理UI元素的尺寸更改效果。

我在片段中尝试了类似的东西:

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

但是没有用。

我的 TextView 的宽度始终为values-port文件夹。

编辑:似乎多余,但这是代码:

<activity
    android:name=".FeedActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:screenOrientation="portrait" >
</activity>

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

我知道我可以从清单中删除android:screenOrientation="portrait"而不是活动中的setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);,但想知道此代码的行为。

2 个答案:

答案 0 :(得分:3)

FeedActivity具有固定的方向,在您的清单中由属性android:screenOrientation指定。因此,当您旋转设备时,它将不执行任何操作。即使它会,你也会覆盖android:configChanges。这是the docs所说的:

  

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

您的清单告诉系统FeedActivity将自己处理方向,screenSize和键盘配置更改。唉,你真的没那样做。

既然你说你在Fragment加载XML,我会认为它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

    <fragment android:layout_width="@dimen/frag_width"
              android:layout_height="match_parent"
              android:tag="your_tag_here"
              class="path.to.your.Fragment"/>

</FrameLayout>

要获得您期望的行为,您应该使用

更新清单
<activity
    android:name=".FeedActivity"
    android:configChanges="screenSize|keyboardHidden"/>

更新

如果您坚持使用Fragment方法更改onConfigurationChanged宽度,则可能会有效:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    final View view = getView();
    if (null != view) {
        view.getLayoutParams().width = getResources().getDimensionPixelSize(R.dimen.width);
    }
}

我会建议不要这样做。

答案 1 :(得分:0)

您可以简单地将具有不同代码的片段放置在“布局 - 土地”中。夹。 当屏幕方向更改为横向时,将从此文件夹中调用所有布局和片段。 因此,您可以复制片段,对横向模式进行必要的更改,并将其放入“布局 - 土地”中。夹。 这应该可以解决问题。