it-swarm.com.ru

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);
  }
21
Pascal Klein

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

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

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

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

10
Amplify91

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

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), вы можете использовать эти константы для ширины и высоты.

5
Lauri

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

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

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

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

0
Rafael Brasil

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

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
Asthme