Android GridVIew根据方向更改列数

我想以网格的forms显示6个图像,如下所示。

在纵向,2 coumns,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); 

我的解决方案

值/ dimens.xml:

  160dp 10dp  

布局/ gridview.xml

  

在你的片段中:

 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; }