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

3

我有一个片段,在其中一个 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" 而不是在 Activity 中使用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);,但我想了解这段代码的行为。


请显示您的代码和清单文件。 - waelhe
为什么它总是从纵向模式开始?
  • 您可以删除此代码以将方向设置为自动 android:screenOrientation="portrait"
- waelhe
@waelhe 是的,这可能是一个问题,但主要问题是当方向改变时,UI没有任何效果。比如说,如果在移除“android:screenOrientation="portrait"”后以正确的尺寸开始,那么如何根据新的尺寸改变TextView的宽度呢? - Housefly
尝试为不同的屏幕方向创建不同的布局,例如将横向布局放置在名为“layout-land”的文件夹中,而将纵向布局放置在名为“layout-port”的文件夹中。 - Marcel Krivek
你如何加载你的“Fragment”? - Tadej
@curtisLoew 它在 Activity 的 XML 中。 - Housefly
2个回答

3
FeedActivity在您的清单文件中通过属性android:screenOrientation指定了固定方向。因此,当您旋转设备时,它将不会做任何事情。即使它会,您也正在覆盖android:configChanges。这是文档中的说明:

列出活动本身将处理的配置更改。当运行时发生配置更改时,默认情况下活动将被关闭并重新启动,但使用此属性声明配置将防止活动重新启动。相反,活动继续运行,并调用其onConfigurationChanged()方法。

您的清单文件告诉系统FeedActivity将处理方向、屏幕大小和键盘配置更改。但是很遗憾,您实际上并没有这样做。
由于您说您正在通过XML加载Fragment,因此我假设它看起来像这样:
<?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"/>

更新

如果您坚持使用onConfigurationChanged方法更改Fragment的宽度,可以尝试以下操作:

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

我建议不要采用这种方法。

唉,你真的不这样做。好吧,我想这样做,在碎片的onConfigurationChanged中可以看到维度发生变化,但如何告诉视图使用这些更新后的尺寸呢? - Housefly

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接