スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Android]onLayoutを使用したレイアウト

AbsoluteLayoutを使おうとすると非推奨と怒られるので
自作ViewGroupで自由にレイアウトを決める方法を調べてみました。

public class SampleLayout extends ViewGroup{

private int mWidthMeasureSpec;
private int mHeightMeasureSpec;

private static final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;
private static final int FP = ViewGroup.LayoutParams.FILL_PARENT;

public SampleLayout(Context c){
super(c);
}

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

mWidthMeasureSpec = widthMeasureSpec;
mHeightMeasureSpec = heightMeasureSpec;
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {

RelativeLayout rl = new RelativeLayout(getContext());
rl.setBackgroundColor(Color.WHITE);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(FP, FP);

TextView tv = new TextView(getContext());
tv.setText("Sample");
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(WC, WC);
rlp.addRule(RelativeLayout.CENTER_IN_PARENT);
rl.addView(tv, rlp);

// 子要素の追加
addViewInLayout(rl, -1, lp);

// 子要素に必要な大きさを計測
int padding = 50;
int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, padding * 2, lp.width);
int childHeightSpec = ViewGroup.getChildMeasureSpec(mHeightMeasureSpec, padding * 2, lp.height);
rl.measure(childWidthSpec, childHeightSpec);

// 子要素の描画範囲を渡してレイアウト
rl.layout(padding, padding, padding + rl.getMeasuredWidth(), padding + rl.getMeasuredHeight());

}

}

addViewではなく、addViewInLayoutで追加することと
子要素の大きさを測るところがミソのようです。

孫要素は子要素にレイアウトをお願いしています。

標準部品のソースは勉強になります。

コメントの投稿

非公開コメント

プロフィール

jou4

Author:jou4
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。