Android: изменение абсолютной позиции вида программно - PullRequest
21 голосов
/ 09 августа 2010

Если вы используете AbsoluteLayout (я знаю, что он устарел, но это был единственный способ решить мою проблему ), вы можете дать childViews теги android:layout_x и android:layout_y для установки абсолютная позиция в пределах AbsoluteLayout.

Однако я не хочу устанавливать эту информацию в xml, потому что я знаю ее только во время выполнения. Итак, как я могу установить эти параметры во время выполнения программно? Я не вижу никакого метода в представлении, как view.setLayoutX(int x) или что-то еще.

Вот мой XML, который отлично работает, когда я устанавливаю значения layout_x и layout_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);
  }

Ответы [ 5 ]

14 голосов
/ 09 августа 2010

Используйте версию addView, которая принимает LayoutParams :

LayoutParams params = mLayout.generateLayoutParams();
params.x = remoteObject.x;
params.y = remoteObject.y;
mLayout.addView(button, params);
10 голосов
/ 25 марта 2011

В ответ на ваш комментарий к ответу Майры у меня была похожая проблема с 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);

Мне потребовалось целую вечность, чтобы понять это, поэтому я хотел опубликовать это здесь для кого-то другого, если им это нужно.

5 голосов
/ 19 апреля 2011

У меня была такая же проблема, но я нашел несколько иное решение.

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 голосов
/ 30 июля 2014

приведенные выше ответы верны. Но этот будет более совершенным

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 голосов
/ 13 апреля 2014

Не знаю почему, но при перемещении верхнего и левого краев Android удерживает правый и нижний края в одном месте.Поскольку я не мог правильно изменить ширину и высоту (изображение исчезало), я использовал this :

LayoutParams layoutParams=new LayoutParams(width, height);
layoutParams.leftMargin = newLeft;
layoutParams.topMargin = newTop;
imageView.setLayoutParams(layoutParams);

Я не знаю, является ли это лучшим способом, ноработал на меня.Я протестировал его в версии 2.2+ и отлично работает!

Вы должны импортировать android.widget.LinearLayout.LayoutParams;потому что по умолчанию используется LayoutParams ViewGroup ( Davit T )

...