0

Androidでサブビューの位置を設定するにはどうすればよいですか?

onLayout() で少し設定することができましたが、特定の値にしか設定できません。その後、サブビューは表示されません。トリミングされていると思いますが、トリミングされる理由と適切に行う方法がわかりません。

画像は次のとおりです。

キャンディー クラッシュ アイコン (部分的に移動) は、コイン パイレーツ アイコン (下部にあり、キャンディー クラッシュ アイコンによってほとんど隠されていました) の右側に移動することになっていました。

Candy Crush アイコンを右に 10 ずつ移動することができました。これ以上移動すると、すべてが表示されなくなります... :(

コードは次のとおりです。

    @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, 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().
//      super.onLayout(changed, l, t, r, b);
    Log.e(LOG_TAG, LOG_TAG + ".onLayout: " + this + ": "+ l + ", " + t + ", " + r + ", " + b);

//      // this is successful
//      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) this.getLayoutParams();//new RelativeLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT );
//      lp.setMargins( lp.leftMargin + 5, lp.topMargin + 5, lp.rightMargin + 5, lp.bottomMargin + 5);
//      setLayoutParams( lp );
//      this.requestLayout();

    int iChildCount = this.getChildCount();
    for ( int i = 0; i < iChildCount; i++ ) {
        int iLeft = i * getIconSize(); // cannot be more than 10, otherwise nothing will show
        View pChild = this.getChildAt(i);
//          Log.d(LOG_TAG, LOG_TAG + ".onLayout child: " + pChild + " size: " + l + ", " + t + ", " + r + ", " + b);
        Log.d(LOG_TAG, LOG_TAG + ".onLayout child: " + pChild + " size: " + pChild.getMeasuredWidth() + ", " + pChild.getMeasuredHeight() + " :: " + pChild.getWidth() + ", " + pChild.getHeight());
        Log.d(LOG_TAG, LOG_TAG + ".onLayout child: " + pChild + " boundary: " + pChild.getLeft() + ", " + pChild.getTop() + ", " + pChild.getRight() + ", " + pChild.getBottom());

        pChild.layout(iLeft, 0, iLeft + pChild.getMeasuredWidth(), pChild.getMeasuredHeight());
//          pChild.layout(l, t, pChild.getMeasuredWidth(), pChild.getMeasuredHeight());

//          LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) pChild.getLayoutParams();
//          lp.setMargins(iLeft, 0, 0, 0);
//          pChild.setLayoutParams(lp);
//          pChild.requestLayout();
    }
}

ヘルプ、サンプル、チュートリアル、説明は大歓迎です...それに関するリソースが見つからないため、試行錯誤で何週間も無駄にしています.onMeasureとonLayoutは文書化されておらず、言われたとおりに機能していません、これは非常にイライラします:

public void layout (int l, int t, int r, int b)

Assign a size and position to a view and all of its descendants

This is the second phase of the layout mechanism. (The first is measuring). In this phase, each parent calls layout on all of its children to position them. This is typically done using the child measurements that were stored in the measure pass().

Derived classes should not override this method. Derived classes with children should override onLayout. In that method, they should call layout on each of their children.

Parameters
l   Left position, relative to parent
t   Top position, relative to parent
r   Right position, relative to parent
b   Bottom position, relative to parent 

編集:

答えを明確にする

@ Ben75 が指摘したように、問題は pChild.layout(iTop, iLeft, iRight, iBottom); の設定が間違っていることが原因です。値。ただし、pChild.layout はビューの onLayout によって呼び出されるものではなく、親の onLayout によって呼び出されるものです。親の onLayout はすべての子を繰り返し処理し、そのレイアウト (iTop,iLeft,iRight,iBottom) を呼び出します。子のレイアウトを (0,0,iWidth,iHeight) に設定しているため、クリッピングが発生します。

4

1 に答える 1