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
_パラメータを削除せずにこの効果を達成するのを手伝ってください
強力なリソースシステムを使用します。
Xmlレイアウトで、列の数を整数リソースに設定してから、/values/integers.xml
縦向きの場合は2に設定し、/values-land/integers.xml
横向きに3に設定します
//まあ、マニフェストでconfigChangesを行う場合は、列数をJava in onConfogurationChangedから変更する必要があります
@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);
私の解決策:
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();
}
@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"を使用している間は、向きを変更してもアクティビティは再作成されません(横向きから縦向き、またはその逆)。このタグをマニフェストから削除したくない場合は、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;
}
ここに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));
}
}