0

指定した XML レイアウトからプログラムで CustomView を拡張する際に問題が発生しています。

RelativeLayout を拡張し、2 つの ImageView と 1 つの LinearLayout を含む別の RelativeLayout を含む CustomView があります。ImageViews は、それぞれ android:layout_alignParentLeft="true" と android:layout_alignParentRight="true" によって親の左右に配置した矢印アイコンであり、間のすべてのスペースを埋めるために LinearLayout が使用されます。

明確にするために、ここに Eclipse Layout Designer の xml レイアウト ビューを示します。これは、私が意図したものです...

my_xml_layout - これは私が望むものです

私がsetContentView(R.layout.my_xml_layout); アクティビティから直接、すべてが Eclipse レイアウト デザイナーに示されているように表示されますが、CustomView のコンストラクターから R.layout.my_xml_layout を膨らませると、ImageView の左右に頑固なマージンができてしまいます。

これは Java コードで行われ、問題があります。

ご覧のとおり、左側の ImageView の左側と右側の ImageView の右側に頑固な間隔があります。

どんな助けでも大歓迎です!前もって感謝します!

my_xml_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

  <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">

        <ImageView
            android:id="@+id/imageLeftArrow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:src="@drawable/dock_leftarrow" />

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >

        </LinearLayout>

        <ImageView
            android:id="@+id/imageRightArrow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:src="@drawable/dock_rightarrow" />

    </RelativeLayout>

</RelativeLayout>

次の行を使用して、CustomView のコンストラクターでインフレートします。

View.inflate( mContext, R.layout.my_xml_layout, this );

私の CustomView の onLayout:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    // Do nothing. Do not call the superclass method--that would start a layout pass
    // on this view's children. PieChart lays out its children in onSizeChanged().
    Log.e("DrawView", "DrawView.onLayout: " + l + ", " + t + ", " + r + ", " + b);

    int iChildCount = this.getChildCount();
    for ( int i = 0; i < iChildCount; i++ ) {
        View pChild = this.getChildAt(i);
        pChild.layout(0, 0, pChild.getMeasuredWidth(), pChild.getMeasuredHeight());
    }
}

私の CustomView の onMeasure:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // Try for a width based on our minimum
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    Log.d("DockView", "DockView.onMeasure: width: " + widthMeasureSpec + " getWidth: " + MeasureSpec.getSize(widthMeasureSpec));
    Log.d("DockView", "DockView.onMeasure: height: " + heightMeasureSpec + " getHeight: " + MeasureSpec.getSize(heightMeasureSpec));
    Log.d("DockView", "DockView.onMeasure: getPaddingLeft: " + getPaddingLeft() + " getPaddingRight: " + getPaddingRight());
    Log.d("DockView", "DockView.onMeasure: getPaddingTop: " + getPaddingTop() + " getPaddingBottom: " + getPaddingBottom());

    // http://stackoverflow.com/a/17545273/474330
    int iParentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int iParentHeight = MeasureSpec.getSize(heightMeasureSpec);
    this.setMeasuredDimension(iParentWidth, iParentHeight);

    int iChildCount = this.getChildCount();
    for ( int i = 0; i < iChildCount; i++ ) {
        View pChild = this.getChildAt(i);
        this.measureChild( pChild, 
                MeasureSpec.makeMeasureSpec(iParentWidth, MeasureSpec.EXACTLY), 
                MeasureSpec.makeMeasureSpec(iParentHeight, MeasureSpec.EXACTLY)
        );
    }
}
4

1 に答える 1