GridLayout
に2つの列があります。私がやりたいのは、これらの列をそれぞれ画面の幅の半分にし、子のコンテンツが独自のセルの幅/高さを満たすようにすることです。子をfill_parent
に設定しようとしましたが、最初の子がレイアウト全体を引き継ぐだけです。そして、GridLayoutはweight
をサポートしていないようです?おそらくもっと良いレイアウトがありますが、自然な選択のように思えるグリッドスタイルのレイアウトが必要です。
このコードは、API21より前のサポートライブラリで利用可能です!
使用可能なスペースの50%を占める2列のgridLayoutに4つのボタンを表示する簡単なコードがあります。
<GridLayout
Android:id="@+id/grid"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:columnCount="2"
>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:layout_gravity="fill"
Android:layout_columnWeight="1"
/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:layout_gravity="fill"
Android:layout_columnWeight="1"
/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:layout_gravity="fill"
Android:layout_columnWeight="1"
/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:layout_gravity="fill"
Android:layout_columnWeight="1"
/>
</GridLayout>
解決策はおそらくこれです:
Android:layout_gravity="fill"
Android:layout_columnWeight="1"
API 21より前の場合、サポートライブラリを使用します。
追加
compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.Android.support:design:23.1.1'
あなたの依存関係に。
次に、xmlファイルで:
<Android.support.v7.widget.GridLayout
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:columnCount="2"
app:orientation="horizontal"
app:rowCount="1">
<TextView
Android:text="1"
Android:textStyle="bold"
app:layout_columnWeight="1"
/>
<TextView
Android:text="2"
Android:textStyle="bold"
app:layout_columnWeight="1" />
</Android.support.v7.widget.GridLayout>
ここでは、「app」プレフィックスの使用に注意し、追加することを忘れないでください
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlファイルに
わかりましたので、グリッドビューをあきらめ、いくつかの線形レイアウトを使用しました。縦に1つ作成してから、2つの横を追加しました。これはグリッドビューよりも少し複雑です...しかし、少なくともこれが機能することがわかるまでは。
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" >
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:orientation="vertical" >
<ImageButton
Android:id="@+id/btn_mybutton"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="5dp"
Android:background="@color/pomegranate"
Android:contentDescription="@string/contentDescriptionmybutton"
Android:src="@drawable/ic_launcher" />
</LinearLayout>
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:orientation="vertical" >
<ImageButton
Android:id="@+id/btn_prefs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="5dp"
Android:background="@color/pomegranate"
Android:contentDescription="@string/contentDescriptionSettings"
Android:src="@drawable/ic_settings" />
</LinearLayout>
</LinearLayout>
そして、これを追加してボタンを正方形にします:)
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
btnPrefs.setMinimumHeight(btnPrefs.getWidth());
btnVerse.setMinimumHeight(btnMyButton.getWidth());
}
使用可能なスペースの50%を占める2列のグリッドレイアウトでビューを動的に追加します。
GridLayout gridLayout = new GridLayout();
View view; //it can be any view
GridLayout.LayoutParams param = new GridLayout.LayoutParams();
param.columnSpec = GridLayout.spec(GridLayout.UNDEFINED,GridLayout.FILL,1f);
param.width = 0;
view.setLayoutParams(param);
gridLayout.add(view);
静的な方法(.xmlファイル内)。
<Android.support.v7.widget.GridLayout
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:alignmentMode="alignBounds"
app:columnCount="2"
app:columnOrderPreserved="false"
app:orientation="horizontal"
Android:layout_margin="20dp"
Android:layout_marginBottom="30dp"
Android:padding="4dp"
app:rowCount="2">
<TextView
Android:layout_marginTop="2dp"
Android:id="@+id/edit_profile_username"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
app:layout_column="0"
app:layout_row="0"
app:layout_gravity="fill"
app:layout_columnWeight="1"
Android:text="@string/user_name" />
<TextView
Android:layout_marginTop="2dp"
Android:id="@+id/edit_profile_first_name"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
app:layout_column="1"
app:layout_row="0"
app:layout_gravity="fill"
app:layout_columnWeight="1"
Android:text="@string/first_name" />
<TextView
Android:layout_marginTop="2dp"
Android:id="@+id/edit_profile_middle_name"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
app:layout_column="0"
app:layout_gravity="fill"
app:layout_columnWeight="1"
app:layout_row="1"
Android:text="@string/middle_name" />
<TextView
Android:layout_marginTop="2dp"
Android:id="@+id/edit_profile_last_name"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
app:layout_column="1"
app:layout_gravity="fill"
app:layout_columnWeight="1"
app:layout_row="1"
Android:text="@string/last_name" />
</Android.support.v7.widget.GridLayout>
GridLayoutManager
を使用すると、setSpanSizeLookup
を使用できます。このメソッドを適切に使用するのに役立つ私のプロジェクトのスニペットを次に示します。
if (mAdapter == null) {
final int columnCount = getResources().getInteger(R.integer.numberGridColumns);
mLayoutManager = new GridLayoutManager(getActivity(), columnCount);
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch (mAdapter.getItemViewType(position)) {
case ListAdapter.VIEW_TYPE_ONE_COLUMN:
return columnCount;
case RecipeListAdapter.VIEW_TYPE_FULL_COLUMN:
default:
return 1;
}
}
});
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new RecipeListAdapter(mPresenter);
mRecyclerView.setAdapter(mAdapter);
}
mAdapter.notifyDataSetChanged();
RelativeLayoutクラスを拡張(または必要に応じてLinearLayoutを使用)して、アイテムの高さが高さと同じになるようにすることができます。
public class GridItem extends RelativeLayout {
public GridItem(Context context) {
super(context);
}
public GridItem(Context context, AttributeSet attr) {
super(context, attr);
}
public GridItem(Context context, AttributeSet attr, int integer) {
super(context, attr, integer);
}
// Override onMeasure to give the view the same height as the specified width
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth());
}
}
アイテムレイアウトの親ビューは、確実に機能するようにGridItemビューにする必要があります。これは、ListAdapterのgetViewで展開するレイアウトファイルである必要があります
<?xml version="1.0" encoding="utf-8"?>
<my.packagename.GridItem xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<!-- The content of the item -->
</my.packagename.GridItem>
そして、GridViewのstretchModeをcolumnWidthに設定します。これにより、すべての項目が指定された列数の幅に収まります。新しいビューは、それらが同じ高さを持つことを確認します。
<GridView
Android:id="@+id/gridList"
Android:numColumns="2"
Android:stretchMode="columnWidth"
/>