2010-09-04 2 views
0

У меня есть FrameView, который создан в моем XML-макете, и в моем коде я пытаюсь создать серию новых ImageViews и добавить их в качестве дочерних элементов этого FrameView. ImageViews маленькие, всего около 15 пикселей, и я хочу, чтобы они отображались в разных положениях вокруг FrameView (я пытаюсь реализовать то, что похоже на экран радара). Я могу создать их и добавить их просто отлично, и они появляются на экране. Однако, когда я пытаюсь установить свои поля, это, похоже, не имеет никакого эффекта. Независимо от того, что я установил, все ImageViews отображаются в верхнем левом углу FrameView, в отличие от смещения соответствующих полей. Ниже приведен мой макет XML, а также код, который генерирует дочерние представления. Я делаю что-то неправильно? Как я могу получить поля, чтобы они отображались правильно? Или есть лучший способ сделать это, чем использовать поля.Установите поля нового вида программно

XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/RadarBackground" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/radar_bg"> 
<FrameLayout 
    android:id="@+id/RadarFrame" 
    android:layout_width="320dip" 
    android:layout_height="320dip" 
    android:layout_marginTop="25dip"> 
</FrameLayout> 
</LinearLayout> 

Java:

for (int i = 0; i < getData().getTargetCount(); i ++) { 
int id = getData().getTargetId(i); 
Log.d(T.TAG_A, "Radar: plotting target " + id); 
TargetView tv = new TargetView(this, id, getData().getTargetName(id)); 
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
lp.setMargins(
    radarCenterX + (int) (getData().calcTargetRadarX(id, radarSize)/radarScale) - (targetSizeX/2), 
    radarCenterY - (int) (getData().calcTargetRadarY(id, radarSize)/radarScale) - (targetSizeY/2), 
    0, 0); 
tv.setImageResource(R.drawable.radar_civilian); 
tv.setOnClickListener(this); 
mTargets.add(tv); 
mFrame.addView(tv, lp); 
} 

ответ

4

FrameLayout не учитывает параметры полей, если не указать вид гравитации. Попробуйте указать гравитацию для всех ImageView.

HTH!

+0

Хм, хорошо. Я просто полагался на силу по умолчанию LEFT & TOP, но я дам им явные значения гравитации. Благодаря! – bjg222

+1

Хорошо, это сработало, спасибо за ответ! Мне просто нужно было добавить атрибуты android: layout_gravity для дочерних элементов FrameLayout (или, в коде, установить элемент тяжести класса FrameLayout.LayoutParams) – bjg222

Смежные вопросы