Разметка Android - выравнивание по правому краю без переноса и сохранения места - PullRequest
0 голосов
/ 26 февраля 2012

То, что я думал, было бы довольно простым макетом, не получается.

У меня есть несколько строк в линейном макете.

Каждая строка имеет "заголовок", "tag "and a" description ".

Описание отображается под заголовком и тегом и не вызывает проблем.

Заголовок имеет неопределенную длину и должен быть выровнен по левому верхнему углу.Тег должен отображаться выровненным по правому краю заголовка (не обязательно по правому краю родителя, если заголовок короткий).Если в одной строке недостаточно места для обоих, заголовок должен переноситься и оставлять место для тега.

Тег имеет свой собственный стиль и поведение и должен быть отдельным элементом от заголовка.

В моем ограниченном опыте мне больше всего повезло с RelativeLayouts, так что это была моя первая попытка:

import android.content.Context;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class ExampleRow extends RelativeLayout {

    private TextView title;
    private TextView description;
    private TextView tag;

    public ExampleRow(Context context) {

        super(context);

        LayoutParams lp;        

        lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        title = new TextView(context);
        title.setId(1);
        addView(title, lp);                 

        lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.BELOW, title.getId());
        description = new TextView(context);
        description.setId(2);
        addView(description, lp);       

        lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.RIGHT_OF, title.getId());
        lp.addRule(RelativeLayout.ABOVE, description.getId());
        lp.setMargins(20, 0, 0, 0);
        tag = new TextView(context);
        addView(tag, lp);

    }
}

Длинные заголовки вынудили бы метку за пределы экрана.

* 1017Затем я попытался использовать вложенный LinearLayouts - основной контейнер в виде LinearLayout с вертикальной ориентацией, в котором «верхняя строка» представляла собой горизонтальный LinearLayout, содержащий заголовок и тег, а нижняя «строка» являлась описанием.Это было той же проблемой, описанной выше.

Затем я попробовал TableLayout с двумя TableRows, но это не только не удалось, но и показало странные причуды, такие как не рендеринг определенных строк вообще, по причинам, которые я не понимаю.Документация по TableLayout и TableRow кажется немного скудной, и я не смог найти Java-эквиваленты полей XML, относящихся к столбцам.

Макет должен быть на Java, а не на XML, по слишком долгим причинами неинтересно упоминать.

Любое понимание приветствуется.

TYIA.

/ EDIT

, чтобы прояснить требование, лучший пример, который я могу придуматьбудет в HTML.

<table>
  <tr>
    <td>title</td>
    <td>tag</td>
  </tr>
  <tr>
    <td colspan="2">description...</td>
  </tr>
</table>

тег всегда находится справа от заголовка, но только настолько далеко, насколько это необходимо (в зависимости от ширины заголовка).заголовок будет перенесен, как только тег станет крайним правым.

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Я думаю, что это макет, который вам нужен:

public class TableLayoutCustom extends TableLayout {

    public TableLayoutCustom(Context context) {
        super(context);

        this.setColumnShrinkable(0, true);
        this.setColumnStretchable(1, true);

        TableRow row1 = new TableRow(context);

        TableRow.LayoutParams lp = new TableRow.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        TextView title = new TextView(context);
        title.setText("Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum ");

        title.setId(1);
        row1.addView(title, lp);

        lp.setMargins(20, 0, 0, 0);
        TextView tag = new TextView(context);
        tag.setText("TAG ME");
        row1.addView(tag, lp);

        this.addView(row1);

        TableRow row2 = new TableRow(context);
        TableRow.LayoutParams tlp = new TableRow.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        tlp.span = 2;
        TextView description = new TextView(context);
        description.setText("Description here");
        description.setId(2);
        row2.addView(description, tlp);

        this.addView(row2);
    }

}

Если вы измените текст заголовка на более короткий, вы увидите, что tag "следует" the title.

0 голосов
/ 26 февраля 2012

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

пока это близко, я все еще открыт для лучшего ответа:

использование правого поля в заголовке и отрицательного левого поля в одинаковом количестве на теге действительно реализует основную идею, предполагается, что я знаюразмер тега.Если я позволю, скажем, 100 пикселей, а текст тега будет длиннее, он будет перенесен.Это не так уж сложно для этой конкретной установки (поскольку у меня есть предсказуемый набор тегов), мне все равно было бы интересно узнать «правильный» подход.

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