Ответ 1
Используйте версию addView, которая принимает LayoutParams:
LayoutParams params = mLayout.generateLayoutParams();
params.x = remoteObject.x;
params.y = remoteObject.y;
mLayout.addView(button, params);
Если вы используете 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);
}
Используйте версию addView, которая принимает LayoutParams:
LayoutParams params = mLayout.generateLayoutParams();
params.x = remoteObject.x;
params.y = remoteObject.y;
mLayout.addView(button, params);
В ответ на ваш комментарий к 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);
Мне потребовалось время, чтобы понять это, поэтому я хотел бы опубликовать его здесь для кого-то еще, если бы им это было нужно.
У меня была такая же проблема, но я нашел несколько другое решение.
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), вы можете использовать эти константы для ширины и высоты.
Я не знаю, почему, но при перемещении верхнего и левого краев 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)
приведенные ответы верны. Но это было бы более совершенным
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)