16

以下のように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 ビュー メソッドにgridView.setNumberOfColumns(2)orメソッドを配置しています。gridView.setNumberOfColumns(3)

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

4

9 に答える 9

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

私の解決策:

値/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();
}
于 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);
        }

    };

次に、必要に応じてグリッドビューにデータを再度ロードします。

そのアクティビティ ノードの android:configChanges="orientation" をマニフェストに配置します。

于 2012-10-17T06:21:25.790 に答える
1

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

于 2012-10-17T05:11:55.013 に答える