Подтвердить что ты не робот

Android: изменение абсолютной позиции представления программно

Если вы используете 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);
  }
4b9b3361

Ответ 1

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

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

Ответ 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" (подсказка try -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 (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)