0

1 つ以上のビューを追加する必要があるクラスがあります。この例では、単一のImageView. 問題なくビューを追加して を使用して整列できますLayoutParametersが、垂直軸に沿ってどこかに整列または中央揃えしようとすると、それらは上部にくっつくか、まったく表示されません (ビューから外れている可能性があります)。
コンストラクターでメソッドを呼び出しますfillView()。これは、すべてのディメンションなどが設定された後に発生します。

fillView()

public void fillView(){
    img = new ImageView(context);
    rl = new RelativeLayout(context);

    img.setImageResource(R.drawable.device_access_not_secure);

    rl.addView(img, setCenter());
    this.addView(rl, matchParent());
}

matchParent()

public LayoutParams matchParent(){
    lp = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
    lp.setMargins(0, 0, 0, 0);
    return lp;
}

setCenter()

public LayoutParams setCenter(){
    lp = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    lp.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); //This puts the view horizontally at the center, but vertically at the top
    return lp;
}

同様に、ALIGN_RIGHT や BELOW などのルールを追加すると正常に機能しますが、ALIGN_BOTTOM や CENTER_VERTICALLY は機能しません。

この方法とオファーの両方を使用してみましたが、結果は同じでしたsetGravity()LinearLayout

4

2 に答える 2

0

追加するImageView前に追加していますRelativeLayout

于 2012-12-17T11:38:01.377 に答える
0

私の方法が水平方向ではなく垂直方向では機能しない理由はまだわかりませんが、問題は解決しました。投稿された方法は機能しましたが、問題はに隠されていましたonMeasure()
以前は、寸法を に渡すだけで寸法を設定していましたsetMeasuredDimension()。にも渡すことで問題を修正しましたlayoutParams()。また、使用していた整数も変更しMeasureSpecsました。

私はこれを変更しました:

 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        super.onMeasure(this.getT_Width(), this.getT_Heigth());     
        this.setMeasuredDimension(desiredHSpec, desiredWSpec);
    }


これに:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    final int desiredHSpec = MeasureSpec.makeMeasureSpec(this.getT_heigth(), MeasureSpec.EXACTLY);
    final int desiredWSpec = MeasureSpec.makeMeasureSpec(this.getT_width(), MeasureSpec.EXACTLY);
    this.getLayoutParams().height = this.getT_heigth();
    this.getLayoutParams().width = this.getT_width();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width = MeasureSpec.getSize(desiredWSpec);
    int height = MeasureSpec.getSize(desiredHSpec);
    setMeasuredDimension(width, height);
}

getT_Width()getT_Heigth()は、別の場所で設定したカスタム ディメンションを取得するために使用したメソッドです。これが誰かに役立つことを願っています。

于 2013-01-02T10:54:33.497 に答える