16

我想以网格的形式显示 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)

android:configChanges请帮我在不删除Manifest.xml中的参数的情况下实现这个效果

4

9 回答 9

44

使用强大的资源系统。

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

// 好吧,如果你在 manifest 中做 configChanges,你将不得不在 onConfogurationChanged 中改变 java 的列数

于 2013-06-02T15:59:46.840 回答
12
@Override
public void onConfigurationChanged(Configuration newConfig) {
    grid.setNumColumns(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2);
    super.onConfigurationChanged(newConfig);
}
于 2012-10-17T06:38:42.930 回答
6

您可以使用以编程方式设置列数

float scalefactor = getResources().getDisplayMetrics().density * 100;
int number = getWindowManager().getDefaultDisplay().getWidth();
int columns = (int) ((float) number / (float) scalefactor);
gridView.setNumColumns(columns);
于 2013-10-16T07:10:54.770 回答
4

我的解决方案:

值/尺寸.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();
}
于 2015-05-10T20:26:47.690 回答
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" 放入清单中。

于 2012-10-17T06:21:25.790 回答
1

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

于 2012-10-17T05:11:55.013 回答
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;
}
于 2017-07-26T14:23:12.680 回答
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));
    }
}
于 2018-09-20T19:47:49.857 回答
0

将此代码添加到 onCreate

 gridView_menu.setNumColumns(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? 3:4);
于 2020-11-30T04:26:07.280 回答