Android GridVIew根据方向更改列数

博观而约取,厚积而薄发。这篇文章主要讲述Android GridVIew根据方向更改列数相关的知识,希望能为你提供帮助。
我想以网格的形式显示6个图像,如下所示。
纵向,2列,3行,横向3列,2行
通过使用android GridView并在layout-port和layout-land目录中定义不同的网格布局,我能够实现这种效果。
后来根据我的活动要求,我在manifest.xml中添加了一个参数

android:configChanges = "mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|fontScale|screenSize"`

一旦屏幕方向改变,停止我的活动重新创建。
添加此参数后,我的网格视图不按预期方式运行。它有时显示1列,有时2列,有时3列。
我将gridView.setNumberOfColumns(2)gridView.setNumberOfColumns(3)方法放在我的网格适配器的get view方法中,具体取决于设备的方向。
请帮助我在不删除Manifest.xml中的android:configChanges参数的情况下实现此效果
答案使用强大的资源系统。
在xml布局中,将列数设置为整??数资源,然后在/values/integers.xml中将其设置为2用于纵向,在/values-land/integers.xml中将其设置为3用于横向
//好吧,如果你在清单中执行configChanges,则必须在onConfogurationChanged中更改java中的列数
另一答案
@Override public void onConfigurationChanged(Configuration newConfig) { grid.setNumColumns(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2); super.onConfigurationChanged(newConfig); }

另一答案您可以使用编程方式设置列数
float scalefactor = getResources().getDisplayMetrics().density * 100; int number = getWindowManager().getDefaultDisplay().getWidth(); int columns = (int) ((float) number / (float) scalefactor); gridView.setNumColumns(columns);

另一答案我的解决方案
【Android GridVIew根据方向更改列数】值/ dimens.xml:
< resources> < dimen name="grip_view_entry_size"> 160dp< /dimen> < dimen name="grip_view_spacing"> 10dp< /dimen> < /resources>

布局/ gridview.xml
< GridView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="auto_fit" android:verticalSpacing="@dimen/grip_view_spacing" android:horizontalSpacing="@dimen/grip_view_spacing" android:stretchMode="columnWidth" android:gravity="center" android:scrollingCache="false" android:fastScrollEnabled="true" android:animationCache="false"/>

在你的片段中:
private void refreshGridView() {int gridViewEntrySize = getResources().getDimensionPixelSize(R.dimen.grip_view_entry_size); int gridViewSpacing = getResources().getDimensionPixelSize(R.dimen.grip_view_spacing); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int numColumns = (display.getWidth() - gridViewSpacing) / (gridViewEntrySize + gridViewSpacing); gridView.setNumColumns(numColumns); }@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); refreshGridView(); }@Override public void onResume() { super.onResume(); refreshGridView(); }

另一答案
@Override public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { setContentView(R.layout.lay_vertical); } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { setContentView(R.layout.lay_horizontal); }};

然后根据需要再次在gridview中加载数据。
在清单中为该活动节点放置android:configChanges =“orientation”。
另一答案当您在清单中使用android:configChanges =“orientation”时,您的活动不会在方向更改时重新创建(Landscape to Portrait,反之亦然)。如果您不想从清单中删除此标记,则必须覆盖onConfigchanged并在其中放置一些代码逻辑。
另一答案我是根据屏幕大小而不是dpi制作的
public static int getGridColumnsCount(Context context){ boolean landscape = context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); float hi=displayMetrics.heightPixels/displayMetrics.xdpi; float wi=displayMetrics.widthPixels/displayMetrics.ydpi; float screenWidthInch= landscape ? Math.max(wi, hi) : Math.min(wi, hi); float screenWidthCm = screenWidthInch * 2.54f; int columns = (int)(screenWidthCm/2); return columns < 3 ? 3 : columns; }

另一答案这是XML:
< GridLayout android:id="@+id/gridLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:columnCount="@integer/num_columns" android:rowCount="@integer/num_rows" android:orientation="vertical"> < !-- TextViews, ImageViews, etc --> < /GridLayout>

然后在你的片段里面:
@BindView(R.id.gridLayout) GridLayout gridLayout; @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); final ArrayList< View> views = new ArrayList< > (); for (int i = 0; i < gridLayout.getChildCount(); i++) { views.add(gridLayout.getChildAt(i)); } gridLayout.removeAllViews(); gridLayout.setColumnCount(getContext().getResources().getInteger(R.integer.num_columns)); gridLayout.setRowCount(getContext().getResources().getInteger(R.integer.num_rows)); for (int i = 0; i < views.size(); i++) { views.get(i).setLayoutParams(new GridLayout.LayoutParams()); gridLayout.addView(views.get(i)); } }


    推荐阅读