gpt4 book ai didi

android - 在不重新创建 View 的情况下在运行时更改 fragment 中的方向时更改布局

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:14:53 62 4
gpt4 key购买 nike

我尝试开发第一个从网上下载图像并在 GridView 中显示它们的应用程序。 gridview 是主 Activity 的 fragment 。下载过程是使用 onCreate 函数中的 AsyncTask 完成的。为了不在更改方向时再次下载图像,我在 Android Manifest 中设置了 android:configChanges="orientation|screenSize"。然后 onCreate 函数只调用一次,一切都很好......除了我必须在横向模式下对 gridview fragment 的布局进行一些更改。所以我在布局/文件夹中创建了 2 个布局表:fragment_library.xmlfragment_library_land.xml。为了使这些更改生效,我尝试使用 onConfigurationChanged 函数手动更改库 fragment 的布局。在运行时,程序评估函数并通过良好的情况(纵向或横向),但使用的布局仍然是纵向模式的布局:fragment_library.xml ...

public class LibraryFragment extends Fragment {
public GridView gridview;
private Boolean isImageAdapterPopulated = false;

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
GetLibraryTask getLibraryTask = new GetLibraryTask(this);
getLibraryTask.execute(Config.URL + "action=getLibrary");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null)
return null;

// gridview
View V = inflater.inflate(R.layout.fragment_library, container, false);
gridview = (GridView)V.findViewById(R.id.gridview);

if(this.isImageAdapterPopulated)
this.setGridAdapter();
return V;
}

@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
inflater.inflate(R.layout.fragment_library_land, null);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
inflater.inflate(R.layout.fragment_library, null);
}
}

public void setGridAdapter(){
this.isImageAdapterPopulated = true;
gridview.setAdapter(new ImageAdapter(getActivity()));
}

// ...
}

fragment 库.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
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"
/>

fragment_library_land.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
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"
/>

感谢您的帮助:)

最佳答案

这是不可能的。 fragment 无法动态更新其布局。但是,您还有一些其他选择。

1。不喜欢这个,但你可能有一个 Fragment 的布局同时具有纵向和水平 View 并显示和隐藏。

fragment 库.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)成员变量:

private GridView mGridViewPortrait;
private GridView mGridViewLandscape;

然后在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 更改为私有(private),并将名称更改为 mGridView*。私有(private)以使其保持“数据封装”和“m”,因为它是该类的成员,只是约定俗成。我还更改了 if-else 子句,因为我希望首先进行肖像检查。

这种方式是最快和最简单的,但是如果你有很大的布局,它可能会增加系统的负担,所以如果你有很多东西,请不要使用它。最好不要使用这种方法。

2。正确的方法是让 Andorid 处理方向并将您的 XML 移动到正确的目录。然而,这将重新创建您的 Fragment(如果您没有设置 setRetainInstance(true);,在这种情况下您不会设置;这将使 Fragment 不会重新创建它的布局(实际上查找 the retain method 它会不要提到 onCreateView 所以你也可以尝试将它设置为 true 并尝试))。

将您的 fragment_library_land.xml 移动到目录 layout-land 而不是 layout 并将其命名为 fragment_library.xml。请注意粗体,它将具有相同的名称但位于不同的目录中。这样 Android 就会知道并根据方向采用正确的布局。

如果我理解了为什么您不想重新创建 fragment ,因为 onCreate(Bundle savedInstanceState) 将再次调用(使用 setRetainInstance(true); 它不会关于我之前写的,你可以试一试)从而创建一个新的 GetLibraryTask 实例并再次下载图像。如果您使用数据库来存储图像,并且如果您有一个 bool 值来跟踪您是否下载了图像,则可以避免这种情况。在 GetLibraryTask 中,您可以挑选出未下载的图像,无论是第一次运行任务还是方向发生变化。您还需要在下载循环中停止检查库任务,在每个项目检查您是否应该下载图像或 fragment 是否不再可用并因此退出任务之前。

现在,当您更改方向时,Activity 将重新创建 LibraryFragment,并根据方向使用布局或布局区域。

代码中的一些旁注:

  • 如我之前所写,永远不要使用公共(public)访问,在必要时始终使用私有(private)或 protected 。 Private 可以一直使用,并且有 getter 和 setter(访问器和修改器)来进行通信。
  • 使用“m”作为成员变量的前缀,在这种情况下 public GridView gridview 将是 private GridView mGridViewprivate Boolean isImageAdapterPopulated将是 private boolean mIsImageAdapterPopulated
  • 如果不需要,切勿将类用于原始类型。您可能在不支持原始类型或类保留等的列表中需要它。
  • 在您的 onConfigurationChanged(Configuration newConfig) 中,您膨胀了一个 XML 并返回了一个 View ,但您没有对其进行任何操作

祝你好运!

关于android - 在不重新创建 View 的情况下在运行时更改 fragment 中的方向时更改布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14339255/

62 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com