Android FrameLayout и TextView - почему LayoutParams работает там, где setGravity () не работает? - PullRequest
3 голосов
/ 24 сентября 2011

Я использую FrameLayout для отображения (по запросу) некоторого текста на экране. Я хочу, чтобы текст находился в определенном месте, поэтому я подумал, что setGravity () сделает эту работу ... но нет, похоже, это никак не повлияет на то, куда идет текст (а другие объекты, такие как ImageView, даже не имеют этот метод).

Итак, во-первых, для чего именно используется TextView.setGravity ()? (Правка. Теперь я понимаю это намного лучше, спасибо! Хотя по следующей части вопроса все еще неясно.)

Во-вторых, кажется, что единственный способ обновить FrameLayout таким способом - создать новый объект FrameLayout.LayoutParams с необходимыми настройками, а затем использовать метод setLayoutParams () для его применения. (Кажется, это автоматически обновляет представление, поэтому необходим запрос requestLayout ()?) И есть ли более простой / более простой способ добиться этого для FrameLayout ... скажем, без создания нового объекта LayoutParams как я сейчас занимаюсь?

Спасибо! Для справки ниже приведен (рабочий) фрагмент кода, показывающий, как я настраиваю этот FrameLayout и TextView.

    FrameLayout fl1 = new FrameLayout(this);
    FrameLayout.LayoutParams flp1 = new FrameLayout.LayoutParams(
        LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    fl1.setId(9001);
    fl1.setLayoutParams(flp1);
      .....
    tv1 = new TextView(this);
    FrameLayout.LayoutParams tvp1 = new FrameLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
        (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
    tv1.setId(9006);
    tv1.setLayoutParams(tvp1); // This works
    tv1.setBackgroundColor(Color.GRAY);
    tv1.setTextColor(Color.BLACK);
    tv1.setText("Dynamic layouts ftw!");
    tv1.setGravity(Gravity.CENTER); // This does NOT work
     .....
    fl1.addView(tv1);

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

1) view.setGravity означает, как должен отображаться вид, если он дочерний. В случае просмотра текста это относится к позиционированию текста. Находясь в линейных слоях или в группах просмотра, он ссылается на дочерние представления.

2) Я проверил твой код. Вы уже используете метод textview.setGravity. В этом случае вам не нужно указывать параметры гравитации в конструкторе FrameLayout.LayoutParams.

Еще одна вещь, которую я заметил, это то, что вы задали для textview ширину и высоту в качестве содержимого переноса, которое будет принимать только размер текста. Таким образом, нет смысла придавать гравитацию, так как текстовое представление не имеет дополнительной области для позиционирования текста по центру. Вам нужно указать ширину textview как fill_parent. Это должно заставить ваше свойство гравитации работать.

Кстати, это очень хорошая статья о Гравитациях . Он объясняет как гравитацию, так и атрибут layout_gravity.

Если вы хотите, чтобы ваше текстовое представление обернуло содержимое, вы должны добавить свое текстовое представление к линейному макету и установить гравитацию к линейному макету.

Это должно дать то, что вы пытаетесь сделать

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
FrameLayout fr = new FrameLayout(this);
fr.setLayoutParams(lp);
fr.setBackgroundColor(Color.RED);

LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
LinearLayout l = new LinearLayout(this);
l.setLayoutParams(lp2);
l.setGravity(Gravity.CENTER);
l.setBackgroundColor(Color.BLUE);

ViewGroup.LayoutParams vp = new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT);
TextView t = new TextView(this);
t.setLayoutParams(vp);
t.setText("Blessan Mathew");
t.setBackgroundColor(Color.CYAN);

l.addView(t);
fr.addView(l);
2 голосов
/ 24 сентября 2011

tv1.setGravity(Gravity.CENTER);

принадлежит гравитации ТЕКСТА внутри TextView.

Как документация заявляет:

Устанавливает горизонтальное выравнивание текста и вертикальную гравитацию. который будет использоваться при наличии дополнительного пространства в TextView за пределами что требуется для самого текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...