web-dev-qa-db-ja.com

Android:ビューの絶対位置をプログラムで変更します

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);
  }
_
21
Pascal Klein

LayoutParams をとるバージョンのaddViewを使用します。

LayoutParams params = mLayout.generateLayoutParams();
params.x = remoteObject.x;
params.y = remoteObject.y;
mLayout.addView(button, params);
14
Cheryl Simon

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);

これを理解するのに永遠に時間がかかったので、他の人が必要に応じてここに投稿したかったのです。

10
Amplify91

私は同じ問題を抱えていましたが、やや異なる解決策を見つけました。

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)、幅と高さにこれらの定数を使用できます。

5
Lauri

理由はわかりませんが、上端と左端を移動するときに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

0
Rafael Brasil

上記の答えは正しいですが、これはより完璧です

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)
0
Asthme