【问题标题】:Android: Change absolute position of a view programmaticallyAndroid:以编程方式更改视图的绝对位置
【发布时间】:2011-03-27 08:52:10
【问题描述】:

如果您使用 AbsoluteLayout(我知道它已被弃用,但这是解决我的 problem 问题的唯一方法),您可以为子视图添加标签 android:layout_xandroid:layout_y 以设置它们在AbsoluteLayout.

但是我不想在 xml 中设置这些信息,因为我只在运行时知道它们。那么如何在运行时以编程方式设置这些参数呢?我在 View 上看不到任何方法,例如 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);
  }

【问题讨论】:

    标签: android runtime position absolutelayout


    【解决方案1】:

    使用带LayoutParams的addView版本:

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

    【讨论】:

    • 谢谢,但是考虑到 mLayout 是 AbsoluteLayout 类型,我该如何创建 LayoutParams? AbsoluteLayout 只有一个方法 absolutLayout.generatelayoutParams(AttributeSet)。我不知道如何首先创建一个属性集,以便我可以将该集传递给 generateLayoutParams()-Method
    • 我在使用 RelativeLayout 而不是 Absolute 时遇到了同样的问题
    • params.xparams.y 似乎已被 RelativeLayout 弃用
    【解决方案2】:

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

    我花了很长时间才弄清楚这一点,所以我想把它贴在这里,如果他们需要的话。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,但找到了一个稍微不同的解决方案。

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

      【讨论】:

        【解决方案4】:

        我不知道为什么,但在移动顶部和左侧边缘时,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 (by Davit T)

        【讨论】:

          【解决方案5】:

          上面的答案都是对的,但是这个会更完美

          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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-11-07
            • 1970-01-01
            • 1970-01-01
            • 2012-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多