web-dev-qa-db-ja.com

Android GridVIew方向に応じて列数を変更

6枚の画像を以下のようにグリッド表示したい。

縦向き、2列、3行、ランドケア向きで3列、2行

Android GridViewを使用し、layout-portおよびlayout-landディレクトリで異なるグリッドレイアウトを定義することで、この効果を達成できました。

後で私のアクティビティ要件に従って、manifest.xmlに1つのパラメーターを追加しました。

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

画面の向きが変わったらアクティビティを停止して再作成します。

このパラメーターを追加した後、グリッドビューが期待どおりに動作しません。 1列、2列、3列の場合もあります。

デバイスの向きに応じて、グリッドアダプターのget viewメソッドにgridView.setNumberOfColumns(2)またはgridView.setNumberOfColumns(3)メソッドを配置しています。

Manifest.xmlの_Android:configChanges_パラメータを削除せずにこの効果を達成するのを手伝ってください

15

強力なリソースシステムを使用します。

Xmlレイアウトで、列の数を整数リソースに設定してから、/values/integers.xml縦向きの場合は2に設定し、/values-land/integers.xml横向きに3に設定します

//まあ、マニフェストでconfigChangesを行う場合は、列数をJava in onConfogurationChangedから変更する必要があります

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

プログラムで列数を設定できます

float scalefactor = getResources().getDisplayMetrics().density * 100;
int number = getWindowManager().getDefaultDisplay().getWidth();
int columns = (int) ((float) number / (float) scalefactor);
gridView.setNumColumns(columns);
6
Pratik Butani

私の解決策:

values/dimens.xml:

<resources>
    <dimen name="grip_view_entry_size">160dp</dimen>
    <dimen name="grip_view_spacing">10dp</dimen>
</resources>

layout/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
almisoft
    @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"をマニフェストに配置します。

2
Amit Hooda

マニフェストでAndroid:configChanges = "orientation"を使用している間は、向きを変更してもアクティビティは再作成されません(横向きから縦向き、またはその逆)。このタグをマニフェストから削除したくない場合は、onConfigchangedをオーバーライドして、コードロジックをそこに配置する必要があります。

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

ここに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));
    }
}
0
Lou Morda