AbsoluteLayoutを使用する場合(推奨されないことはわかっていますが、これが 問題 を解決する唯一の方法でした)、childViewsにタグ_Android:layout_x
_および_Android:layout_y
_を与えることができますAbsoluteLayout
内の絶対位置を設定します。
ただし、これらの情報はxmlに設定したくありません。実行時にしかわからないからです。では、これらのパラメーターをプログラムで実行時に設定するにはどうすればよいですか?ビューにview.setLayoutX(int x)
などのメソッドが表示されません。
_layout_x
_および_layout_y
_の値を設定すると、正常に機能するXMLを次に示します。
_<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/myLayout"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content">
<ImageView
Android:src="@drawable/myImageView"
Android:layout_width="1298px"
Android:layout_height="945px"
Android:layout_x="0px"
Android:layout_y="0px" />
<Button
Android:id="@+id/myButton1"
Android:text="23"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_x="50px"
Android:layout_y="300px"
Android:tag="23"/>
<Button
Android:id="@+id/myButton2"
Android:text="48"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_x="50px"
Android:layout_y="300px"
Android:tag="48"/>
</AbsoluteLayout>
_
実際、xml内にボタンをもう設定するのではなく、リモート経由で情報を取得し、その情報に応じてボタンを追加します。
これらのボタンを追加するためにonCreateMethod
で使用しているコードの一部を次に示します。
_ for (MyRemoteObject remoteObject: list) {
Button button = new Button(this);
button.setOnClickListener (listener);
button.setTag(remoteObject.id);
button.setText(remoteObject.id);
// button.setLayoutX(remoteObject.x) ????
// button.setLayoutY(remoteObject.y) ????
myLayout.addView(button);
}
_
LayoutParams をとるバージョンのaddViewを使用します。
LayoutParams params = mLayout.generateLayoutParams();
params.x = remoteObject.x;
params.y = remoteObject.y;
mLayout.addView(button, params);
Mayraの回答に対するあなたのコメントに対して、AbsoluteLayoutではなくRelativeLayoutで同様の問題がありました。解決策は、同様の方法を使用して、レイアウトタイプとしてキャストすることでした。このようなもの:
LayoutParams params = (Android.widget.RelativeLayout.LayoutParams) this.generateDefaultLayoutParams();
params.height = 360;
params.width = 360;
params.addRule(CENTER_IN_PARENT);
this.addView(board, params);
これを理解するのに永遠に時間がかかったので、他の人が必要に応じてここに投稿したかったのです。
私は同じ問題を抱えていましたが、やや異なる解決策を見つけました。
int width = 100, height = 50, x = 10, y = 20;
Button button = new Button(this);
AbsoluteLayout myLayout = (AbsoluteLayout)findViewById(R.id.myLayout);
myLayout.add(button, new AbsoluteLayout.LayoutParams(width, height, x, y));
また、「fill_parent」に使用するものがわかったら(ヒント-1)、幅と高さにこれらの定数を使用できます。
理由はわかりませんが、上端と左端を移動するときにAndroidは右端と下端を同じ場所に保ちます。幅と高さを適切に変更できなかったため(画像は消えていました)、私は this を使用しました:
LayoutParams layoutParams=new LayoutParams(width, height);
layoutParams.leftMargin = newLeft;
layoutParams.topMargin = newTop;
imageView.setLayoutParams(layoutParams);
それが最善の方法かどうかはわかりませんが、私のために働いた。 2.2+でテストしましたが、正常に動作します!
Android.widget.LinearLayout.LayoutParamsをインポートする必要があります。デフォルトはViewGroupのLayoutParamsであるため( Davit T )
上記の答えは正しいですが、これはより完璧です
AbsoluteLayout.LayoutParams layoutParams = new AbsoluteLayout.LayoutParams(AbsoluteLayout.LayoutParams.WRAP_CONTENT,AbsoluteLayout.LayoutParams.WRAP_CONTENT,DragLayer.int left_location,int top_location);
layout.addView(view,layoutParams)