0

onMeasure をオーバーライドするカスタム RelativeLayout があるとします。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension(200, 200);
}

ここで、このレイアウトに、このカスタム RelativeLayout の下部に位置合わせするビューを追加したいと思います。しかし、結果なしでさまざまなことを試しました:

paramsButton.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
addView (mButton, paramsButton);

私の最初の推測は、下を親に揃えることでした(これはカスタムのRelativeLayoutですよね?)。しかし、明らかに、それは私のカスタム レイアウト (今回はカスタムではなく、別の RelativeLayout です) の親と一致します。

だから私は id に合わせようとしました:

paramsButton.addRule(RelativeLayout.ALIGN_BOTTOM, getId());
addView (mButton, paramsButton);

しかし、それも機能していません(ボタンが消えます)NB:カスタムRelativeLayoutのIDを明示的に設定して、Androidが正しいIDを取得したことを確認しました。

これを機能させる方法はありますか?

編集: 面白いこと:次のルールでうまく機能します

paramsButton.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
addView (mButton, paramsButton);

だから私は本当に理解していないと言わざるを得ない

RelativeLayout.ALIGN_PARENT_BOTTOM

ルールが通用しない…

4

2 に答える 2

5

オーバーライドへのアプローチにonMeasureは欠陥があります。この場合、レイアウトはその子を測定し (そしてそれらはサイズを保存します)、実際に気が変わってそのサイズを変更したいことを (子ではなく) レイアウトだけに伝えます。

代わりに、次のことを試してください。

widthMeasureSpec = MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

一般に、コードにサイズを入れることは良い考えではありません。代わりに、固定サイズの layout_width と layout_height を持つスタイルを使用するか、少なくとも<dimen>リソースを使用することを検討してください。

于 2013-04-08T23:19:58.180 に答える
0

別の RelativeLayout/LinearLayout またはその他のレイアウト/ウィジェットをボタンの上に配置して、layout_weight を 1 に設定しようとしましたか? layout_weight を設定することにより、ボタンの上のウィジェットがこのカスタム RelativeLayout 内の残りのスペースのみを使用するようになります。

于 2013-04-06T19:58:37.317 に答える