Android: центр Textview в расширенном макете - PullRequest
1 голос
/ 27 марта 2012

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

В настоящее время я вызываю parent.layout (), и все его дочерние элементы получают ширину и высоту ноль. Разве я не могу как-то установить дочерние элементы для FillParent вместо установки макета на ALL? : - (

Кстати, мой родитель - это расширенный LinearLayout, содержащий в основном Textviews.



Edit: Какой-то код:

myLayout расширяет LinearLayout

myLayout.layout(left, top, right, bottom);                
myLayout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1));

for each child in myLayout do {
  child.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  if (v instanceof TextView) {
    ((TextView) v).setGravity(Gravity.CENTER);
  }

Но у ребенка все еще есть:
слева: 0 сверху: 0 справа: 0 снизу: 0

Редактировать 2: Кстати, приведенный выше код является инсайдером метода onLayout ViewGroup.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2012

Ваши дочерние представления не измеряются (так как вы не вызываете их макет ()), поэтому система все еще думает, что они имеют размер 0x0px.

Android использует 2-проходную систему измерения / разметки.

Ознакомьтесь с документацией разработчика, чтобы увидеть, как происходит последовательность рисования / макета: http://developer.android.com/guide/topics/ui/how-android-draws.html

Возможно, вы захотите попытаться вызвать их layout(), затем установить высоту / ширину для дочерних элементов, а затем вызвать requestLayout().

Надеюсь, это поможет.

0 голосов
/ 13 апреля 2012

Вы можете установить ширину и высоту дочерних элементов в onLayout() методе вашего расширенного LinearLayout. Например:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    int count = getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        // set width of every child to FILL_PARENT, and height to WRAP_CONTENT
        child.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    }
}

Я не знаю, почему setGravity() не работает для вас. Может быть, вы установите гравитацию не для ребенка, а для макета? Я могу установить гравитацию, например в onLayout():

if (child instanceof TextView) {
    ((TextView) child).setGravity(Gravity.CENTER);
}
...