Android:以编程方式更改视图的绝对位置

时间:2010-08-09 15:16:01

标签: android runtime position absolutelayout

如果你使用AbsoluteLayout(我知道它已被弃用,但这是解决我的 problem的唯一方法),你可以给childViews标签android:layout_xandroid:layout_yAbsoluteLayout

中设置其绝对位置

但是我不想在xml中设置这些信息,因为我只在运行时知道它们。那么如何在运行时以编程方式设置这些参数呢?我没有在视图上看到view.setLayoutX(int x)之类的任何方法。

当我设置layout_xlayout_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);
  }

5 个答案:

答案 0 :(得分:14)

使用带LayoutParams

的addView版本
LayoutParams params = mLayout.generateLayoutParams();
params.x = remoteObject.x;
params.y = remoteObject.y;
mLayout.addView(button, params);

答案 1 :(得分:10)

在回复你对Mayra答案的评论时,我遇到了与RelativeLayout而不是AbsoluteLayout类似的问题。解决方案是使用类似的方法并将其转换为布局类型。像这样:

LayoutParams params = (android.widget.RelativeLayout.LayoutParams) this.generateDefaultLayoutParams();
params.height = 360;
params.width = 360;
params.addRule(CENTER_IN_PARENT);
this.addView(board, params);

我花了很长时间才想到这一点,所以如果他们需要,我想在这里发布给别人。

答案 2 :(得分:5)

我遇到了同样的问题,但发现了一个不同的解决方案。

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),那么您可以将这些常量用于宽度和高度。

答案 3 :(得分:0)

我不知道为什么,但是当移动顶部和左边时,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

答案 4 :(得分:0)

以上答案是正确的。但这一个会更完美

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)