web-dev-qa-db-ja.com

カスタムスクエアLinearLayout。どうやって?

正方形のレイアウト用に独自のクラスを作成します。

public class SquareLayout extends LinearLayout{

    public SquareLayout(Context context) {
        super(context);
    }

    public SquareLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public SquareLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        int size = width > height ? height : width;
        setMeasuredDimension(size, size);
    }

次に、私のxmlで:

...
        <com.myApp.SquareLayout
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:layout_gravity="center_horizontal"
            Android:orientation="horizontal" >

            <ImageView
                Android:id="@+id/cellImageView"
                Android:adjustViewBounds="true"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="2dp"
                Android:padding="2dp"
                Android:scaleType="centerCrop"
                Android:src="@drawable/image" />
        </com.myApp.SquareLayout>
...

Javaコードにはこれ以上何も書かれていません。しかし、代わりに、レイアウトと画像の場合、白い長方形しか表示されません...

私は何が間違っていますか?

21
Geltrude

// super.onMeasure(widthMeasureSpec、widthMeasureSpec);を呼び出すのを忘れています

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    int size = width > height ? height : width;
    setMeasuredDimension(size, size);

}

// xmlファイル

<com.example.testapplication.SquareLayout
    Android:id="@+id/layout"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_gravity="center_horizontal"
    Android:orientation="horizontal" >

    <ImageView
        Android:id="@+id/cellImageView"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="2dp"
        Android:adjustViewBounds="true"
        Android:padding="2dp"
        Android:scaleType="centerCrop"
        Android:src="@drawable/ic_launcher" />

  </com.example.testapplication.SquareLayout> 
20
Pawan Yadav

同じ手法をRelativeLayoutに適用すると、setMeasuredDimensionを直接呼び出すのに問題がありました。下端に対して正しく位置合わせできませんでした。代わりに、新しいメジャー仕様でsuper.onMeasure()を呼び出すように変更するとうまくいきました。

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    int size = Math.min(width, height);
    super.onMeasure(MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY),
        MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY));
  }
9
Alex

編集:

ConstraintLayout が新しい標準になり、この機能を提供するため、以下のソリューションは非推奨になりました。

元の回答:

Androidチームが解決策を提供してくれましたが、誰もそれについて知りません! パーセントサポートライブラリ からこれらの2つのクラスをチェックしてください:

ビューの比率を適用する場合は、これらのレイアウトのいずれかに配置する必要があります。したがって、この場合、サブクラスではなく、標準のLinearLayoutを、適切なアスペクト比のこれらのレイアウトの1つに配置する必要があります。 PercentFrameLayoutを使用する場合の例:

<Android.support.percent.PercentFrameLayout
         xmlns:Android="http://schemas.Android.com/apk/res/Android"
         xmlns:app="http://schemas.Android.com/apk/res-auto"
         Android:layout_width="match_parent"
         Android:layout_height="match_parent">
     <LinearLayout
         Android:layout_width="match_parent"
         Android:layout_height="match_parent"
         app:layout_aspectRatio="100%">
         <!-- Whatever subviews you want here -->
     </LinearLayout>
 </Android.support.percent.PercentFrameLayout>

これで、すべてのビューが正方形の線形レイアウトに含まれるようになります。

gradleの依存関係を追加することを忘れないでくださいcompile 'com.Android.support:percent:23.3.0'必要に応じてバージョン番号を調整します

6