Android GridVIew根据方向更改列数

时间:2012-10-17 04:55:50

标签: android android-layout gridview

我想以网格形式显示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参数的情况下帮助我实现此效果

9 个答案:

答案 0 :(得分:38)

使用强大的资源系统。

在xml布局中,将列数设置为整​​数资源,然后在/values/integers.xml中将其设置为2用于纵向,在/values-land/integers.xml中将其设置为3用于横向

//好吧,如果你在清单中执行configChanges,你将不得不在onConfogurationChanged中改变java的列数

答案 1 :(得分:11)

@Override
public void onConfigurationChanged(Configuration newConfig) {
    grid.setNumColumns(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2);
    super.onConfigurationChanged(newConfig);
}

答案 2 :(得分:6)

您可以使用

以编程方式设置列数
float scalefactor = getResources().getDisplayMetrics().density * 100;
int number = getWindowManager().getDefaultDisplay().getWidth();
int columns = (int) ((float) number / (float) scalefactor);
gridView.setNumColumns(columns);

答案 3 :(得分:4)

我的解决方案:

<强>值/ 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();
}

答案 4 :(得分:2)

    @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”。

答案 5 :(得分:1)

当您在清单中使用android:configChanges =“orientation”时,您的活动不会在方向更改时重新创建(Landscape to Portrait,反之亦然)。如果您不想从清单中删除此标记,则必须覆盖onConfigchanged并在其中放置一些代码逻辑。

答案 6 :(得分:1)

我根据屏幕尺寸制作,而不是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;
}

答案 7 :(得分:0)

这是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));
    }
}

答案 8 :(得分:0)

将此代码添加到onCreate

 gridView_menu.setNumColumns(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? 3:4);