web-dev-qa-db-ja.com

GridLayout列の幅

GridLayoutに2つの列があります。私がやりたいのは、これらの列をそれぞれ画面の幅の半分にし、子のコンテンツが独自のセルの幅/高さを満たすようにすることです。子をfill_parentに設定しようとしましたが、最初の子がレイアウト全体を引き継ぐだけです。そして、GridLayoutはweightをサポートしていないようです?おそらくもっと良いレイアウトがありますが、自然な選択のように思えるグリッドスタイルのレイアウトが必要です。

44
bwoogie

このコードは、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"
50
Tobliug

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ファイルに

12

わかりましたので、グリッドビューをあきらめ、いくつかの線形レイアウトを使用しました。縦に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());

 }
5
bwoogie

使用可能なスペースの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>
3
Naresh Palle

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();
0
Stefan Medack

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"
/>
0
se_bastiaan