2

プログラムで ImageView を作成しています:

   LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(50,50);
   lp.setMargins(4,4,4,4);

   ImageView color = new ImageView(this);
   color.setLayoutParams(lp);
   colorPicker.addView(color); //adding view to linearlayout
   Log.i("X", "" + color.getX());
   ...

color's経由で x 位置を取得しようとしていますcolor.getX()が、何らかの理由で、マージンを考慮していないことを意味する0代わりに返されます4

また、私が見つけたドキュメントでいくつかの検索を行った後、requestLayout()これを解決するかもしれませんが、どちらも役に立ちません

public void setMargins (int left, int top, int right, int bottom)

余白をピクセル単位で設定します。新しいマージンが考慮されるように、requestLayout() を呼び出す必要があります。左右のマージンは、レイアウトの方向に応じて requestLayout() によってオーバーライドされる場合があります。

アップデート

color.getX()onClickリスナー内で呼び出すと、期待どおり4が返されます

4

1 に答える 1

3

widthheightmarginsなどはすぐには適用されません。サイズが調整されて画面に配置されるViewまで待つ必要があります。UI

android:layout_width="match_parent" で設定されている場合、getWidth() は 0 を返します。

これを試して:

ViewTreeObserver vto = color.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        Log.i("X", "" + color.getX());

    } 
});

「色」変数を作成するfinalglobal、 内でアクセスできるようにする必要がありlistenerます。

于 2013-08-01T11:47:44.877 に答える