这不可能。 Fragment 无法动态更新其布局。不过,您确实还有其他一些选择。
1。不喜欢这个,但您可能有一个片段的布局,同时具有纵向和水平视图并显示和隐藏。
片段_库.xml:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview_portrait"
android:cacheColorHint="@android:color/transparent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="200dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="20dp"
android:stretchMode="columnWidth"
android:gravity="bottom"
/>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview_landscape"
android:cacheColorHint="@android:color/transparent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="400dp"
android:numColumns="2"
android:verticalSpacing="50dp"
android:horizontalSpacing="50dp"
android:stretchMode="columnWidth"
android:gravity="bottom"
android:visible="gone"
/>
然后是一些私有成员变量:
private GridView mGridViewPortrait;
private GridView mGridViewLandscape;
Then in onConfigurationChanged(Configuration newConfig)
:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
mGridViewPortrait.setVisibility(View.VISIBLE);
mGridViewLandscape.setVisibility(View.GONE);
}
else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
mGridViewPortrait.setVisibility(View.GONE);
mGridViewLandscape.setVisibility(View.VISIBLE);
}
}
几点:请注意,我省略了引用两个 GridView 的代码。我还将您的 GridView 更改为私有,并将名称更改为 mGridView*。私有以保持其“数据封装”和“m”,因为它是类的成员,只是约定。我还更改了 if-else 子句,因为我希望首先进行肖像检查。
这种方式是最快和最简单的,但是如果您有很大的布局,它可能会变得对系统来说很重,所以这样做not如果你有很多东西,请使用这个。最好根本不要使用这种方法。
2。正确的方法是让 Android 处理方向并将 XML 移动到正确的目录。然而,这将重新创建您的片段(如果您不设置setRetainInstance(true);
在这种情况下你不会;这将使片段不会重新创建它的布局(实际上是查找保留方法它没有提到onCreateView
所以你也可以尝试将其设置为 true 并尝试))。
将fragment_library_land.xml移动到目录layout-land而不是layout并将其命名片段库.xml。请注意粗体,它将具有相同的名称,但位于不同的目录中。这样 Android 就会知道并根据方向采取正确的布局。
如果我明白为什么你不想重新创建片段,因为onCreate(Bundle savedInstanceState)
将再次被调用(与setRetainInstance(true);
它不会,并且关于我之前写的内容,你可以尝试一下),从而创建一个新实例GetLibraryTask
并再次下载图像。如果您使用数据库来存储图像并且您有一个布尔值来跟踪您是否已下载图像,则可以防止这种情况。在GetLibraryTask
然后,您将挑选出未下载的图像,无论是第一次运行任务还是方向发生变化。您还需要在下载循环中的库任务中进行停止检查,在每个项目之前检查您是否应该下载图像或片段是否不再可用,从而退出任务。
现在,当您更改方向时,活动将重新创建库片段,并根据方向使用布局或布局区域。
代码中的一些附注:
- 正如我之前所写,永远不要使用公共访问,在必要时始终使用私有或受保护的访问。 Private 可以一直使用,并且有 getter 和 setter(访问器和修改器)来进行通信。
- 在本例中使用“m”作为成员变量的前缀
public GridView gridview
将会private GridView mGridView
and private Boolean isImageAdapterPopulated
将会private boolean mIsImageAdapterPopulated
- 如果不需要,切勿将类用于原始类型。您可能在不支持原始类型或类保留等的列表中需要它。
- In your
onConfigurationChanged(Configuration newConfig)
你膨胀了一个 XML,它返回一个视图,但你没有用它做任何事情
祝你好运!