Поместите 2+ текстовые поля бок о бок в LinearLayout (горизонтально) программно - PullRequest
0 голосов
/ 25 августа 2018

я знаю, таких вопросов много. Я много читаю на stackoverflow и google по этой теме, но ничего не помогло мне: (

Хорошо, вот проблема. У меня есть небольшое приложение. В этом приложении у меня есть фрагмент. Файл layout.xml для этого фрагмента включает в себя заполнитель linearlayout, как показано ниже

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:id="@+id/placeholderLinLayout">
        </LinearLayout>

Фрагмент имеет кнопку. Если вы щелкнете по нему, откроется DialogFragmentPopup, и вы сможете ввести некоторые данные. После ввода данных вы можете нажать на другую кнопку в этом диалоговом окне, и данные будут перенесены в основной фрагмент. Здесь я вызываю метод, который должен программно генерировать макет для представления данных. Я использую следующий код

            myRoot = (LinearLayout) view.findViewById(R.id.placeholderLinLayout);
            innerLayout = new LinearLayout(view.getContext());
            innerLayout.setOrientation(LinearLayout.VERTICAL);
            innerLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

            LinearLayout productHeaderLayout = new LinearLayout(getContext());
            productHeaderLayout.setOrientation(LinearLayout.HORIZONTAL);
            productHeaderLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

            TextView product_header = new TextView(getContext());
            product_header.setText("Produkt");
            product_header.setLayoutParams(layoutParams);

            TextView amount_header = new TextView(getContext());
            amount_header.setText("Menge");
            amount_header.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
            amount_header.setLayoutParams(layoutParams);

            TextView packaging_header = new TextView(getContext());
            packaging_header.setText("Verpackung");
            packaging_header.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
            packaging_header.setLayoutParams(layoutParams);

            TextView price_header = new TextView(getContext());
            price_header.setText("Preis");
            price_header.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
            price_header.setLayoutParams(layoutParams);

            TextView payment_header = new TextView(getContext());
            payment_header.setText("Zahlart");
            payment_header.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
            payment_header.setLayoutParams(layoutParams);

            productHeaderLayout.addView(product_header);
            productHeaderLayout.addView(amount_header);
            productHeaderLayout.addView(packaging_header);
            productHeaderLayout.addView(price_header);
            productHeaderLayout.addView(payment_header);

            innerLayout.addView(productHeaderLayout);

Проблема в том, что первое текстовое представление выталкивает все другие текстовые представления из видимого пространства, см. Скриншот

enter image description here

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

Так что я надеюсь, что кто-то может помочь найти проблему в моем коде:)

Привет

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Проблема в том, что вы устанавливаете TextView равным MATCH_PARENT по ширине. Таким образом, один TextView занимает весь экран, а другой начинается только с него. Чтобы решить эту проблему, установите ширину layoutparam на WRAP_CONTENT.

Еще лучше, если вы хотите распространить его, вы можете использовать свойство веса LinearLayout, чтобы они занимали как можно больше места:

textview.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1f));

Третий параметр 1f - это вес. Вес одного означает, что он займет все доступное пространство, не мешая другим детям, следовательно, они будут распределяться равномерно.

0 голосов
/ 26 августа 2018

Если вы хотите, чтобы ваши TextViews располагались рядом, вы должны установить ориентацию LinearLayout на horizontal вместо vertical

0 голосов
/ 25 августа 2018

Установите для всех параметров макета TextView следующее:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1f);

И удалите .setWidth(ViewGroup.LayoutParams.MATCH_PARENT); из всех TextViews.

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

...