Разрушающий макет виджета для Android - PullRequest
94 голосов
/ 14 февраля 2009

Я пытаюсь создать действие, которое представляет некоторые данные пользователю. Данные таковы, что их можно разделить на «слова», каждое из которых является виджетом, и последовательность «слов» будет формировать данные («предложение»?), Виджет ViewGroup, содержащий слова. Поскольку пространство, необходимое для всех «слов» в «предложении», будет превышать доступное горизонтальное пространство на дисплее, я хотел бы обернуть эти «предложения» так же, как обычный текст.

Следующий код:

public class WrapTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout l = new LinearLayout(this);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(
                new ViewGroup.MarginLayoutParams(
                        LinearLayout.LayoutParams.WRAP_CONTENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
        mlp.setMargins(0, 0, 2, 0);

        for (int i = 0; i < 10; i++) {
            TextView t = new TextView(this);
            t.setText("Hello");
            t.setBackgroundColor(Color.RED);
            t.setSingleLine(true);
            l.addView(t, mlp);
        }

        setContentView(l, lp);
    }
}

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

non-wrapping

wrapping

Существует ли такая компоновка или комбинация компоновок и параметров, или я должен реализовать для этого свою собственную ViewGroup?

Ответы [ 12 ]

1 голос
/ 11 октября 2012

Некоторые из приведенных здесь ответов дадут мне ClassCastException в редакторе макетов Exclipse. В моем случае я хотел использовать ViewGroup.MarginLayoutParams, а не делать свой собственный. В любом случае, убедитесь, что вы возвращаете экземпляр LayoutParams, который нужен вашему классу макета, в generateLayoutParams. Вот как выглядит мой, просто замените MarginLayoutParams на тот, который нужен вашей ViewGroup:

@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
    return new MarginLayoutParams(getContext(), attrs);
}

@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
    return p instanceof MarginLayoutParams;
}

Похоже, этот метод вызывается для назначения объекта LayoutParams для каждого дочернего элемента в ViewGroup.

0 голосов
/ 18 февраля 2009

Попробуйте установить оба параметра lp LayoutParams равными WRAP_CONTENT.

Установка mlp равной WRAP_CONTENT, WRAP_CONTENT гарантирует, что ваши TextView (s) t достаточно широки и достаточно высоки, чтобы держать «Hello» или что-либо еще положить в них. Я думаю, l может не знать, насколько широки ваши t . setSingleLine(true) тоже может внести свой вклад.

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