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_library.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" />
感谢帮助 :)
解决方法
1.不是这个的粉丝,但你可能同时拥有Fragment的布局同时包含肖像和水平视图并显示和隐藏.
fragment_library.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;
然后在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); } }
一些要点:请注意,我省略了引用两个GridViews的代码.我还将您的GridView更改为私有,并将名称更改为mGridView *.私有以保持“数据封装”和“m”,因为它是类的成员,只是约定.我也改变了if-else子句,因为我想先将肖像检查放在首位.
这种方式是最快和最简单的,但是如果你有大的布局,它可能会变得很重,所以如果你有很多东西就不要使用它.最好不要使用这种方法.
2.正确的方法是让Andorid处理方向,并将XML移动到正确的目录.然而,这将重新创建你的Fragment(如果你没有设置setRetainInstance(true);在这种情况下你不会;这将使Fragment不重新创建它的布局(实际上查找the retain method它没有提到onCreateView所以你可能会尝试设置这也是真实的,并尝试)).
将fragment_library_land.xml移动到目录layout-land而不是layout,并将其命名为fragment_library.xml.注意粗体,它将具有相同的名称,但保留在不同的目录中.这样Android就会知道并根据方向采取正确的布局.
如果我已经理解为什么你不想重新创建片段,因为onCreate(Bundle savedInstanceState)将再次被调用(使用setRetainInstance(true);它不会和我之前写的那样你可以尝试一下)因此创建GetLibraryTask的新实例并再次下载图像.如果您使用数据库存储图像,并且如果您有一个布尔值,如果您已下载图像,则可以防止这种情况.在GetLibraryTask中,您将选择未下载的图像,无论是第一次运行任务还是更改方向.您还需要在下载循环中对库任务进行停止检查,在每个项目检查之前是否应该下载图像,或者片段是否不再可用,从而退出任务.
现在,当您更改方向时,Activity将重新创建LibraryFragment,并根据方向使用layout或layout-land.
您的代码中的一些附注:
>正如我之前所写,永远不要使用公共访问,在必要时始终使用私有或受保护. Private可以一直使用,并有getter和setter(加法器和mutators)来进行通信.
>使用“m”作为成员变量的前缀,在这种情况下,公共GridView gridview将是私有GridView mGridView和private布尔isImageAdapterPopulated将是私有boolean mIsImageAdapterPopulated
>如果您不需要,请不要使用基类类.您可能需要在不支持基本类型或类保留等的列表中.
>在你的onConfigurationChanged(配置newConfig)中,你膨胀一个XML,然后它返回一个View,但是你没有对它做任何事情
祝你好运!