2010-08-09 61 views
19

如果您使用AbsoluteLayout(我知道它已被弃用,但它是解决我的 problem的唯一方法),您可以给childViews标记android:layout_xandroid:layout_y以设置它们的绝对在AbsoluteLayout内的位置。Android:以编程方式更改视图的绝对位置

但是我不想在xml中设置这些信息,因为我只在运行时就知道它们。那么我怎样才能以编程方式在运行时设置这些参数?我在视图上看不到任何方法,如view.setLayoutX(int x)或其他。

这里是我的XML,当我设置layout_xlayout_y值的正常工作,:

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

回答

12

使用addView的版本需要LayoutParams

LayoutParams params = mLayout.generateLayoutParams(); 
params.x = remoteObject.x; 
params.y = remoteObject.y; 
mLayout.addView(button, params); 
+1

谢谢你,但如何如何创建的LayoutParams因为mLayout是类型AbsoluteLayout的? AbsoluteLayout只有一个方法absolutLayout.generatelayoutParams(AttributeSet)。我不知道如何创建一个attributeSet在第一个地方,以便我可以将该设置传递给generateLayoutParams() - 方法 – 2010-08-09 17:35:46

+0

我有同样的问题与RelativeLayout而不是绝对 – Amplify91 2011-03-25 20:04:10

9

针对您的对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); 

我花了我一个脑筋想出来,所以我想在这里发布给别人,如果他们需要它。

4

我只是有同样的问题,但发现了一个不同的解决方案。

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

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

0

上述答案right.but这个人会更完美

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) 
相关问题