我想以网格的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; }