2010-08-09 3 views
19

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

Однако я не хочу устанавливать эту информацию в 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); 
    } 

ответ

12

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

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

Спасибо, но как, как я могу создать LayoutParams, учитывая, что mLayout имеет тип AbsoluteLayout ? AbsoluteLayout имеет только метод absolutLayout.generatelayoutParams (AttributeSet). Я не знаю, как создать атрибутSet в первую очередь, чтобы я мог передать этот набор в generateLayoutParams() - Method –

+0

У меня такая же проблема с RelativeLayout, а не с Absolute – Amplify91

9

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

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

4

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

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

Я не знаю почему, но при перемещении верхнего и левого краев 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)

0

вышеуказанные ответы right.but это один будет более совершенным

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) 
Смежные вопросы