Search code examples
androidandroid-layoutandroid-linearlayoutandroid-xml

How to make horizontal Linear Layout Child wrap its content?


As the title suggests in my case the child view is a TextView with some content. and I want it to be one per line

So putting layout_width to 0dp and adding layout_weight to 1 did not work, Im assuming that because its the only one in its line so 1 is the highest wight... not sure about it though

this is the xml:

    <LinearLayout
        android:id="@+id/tagsVerticalLineup"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:orientation="vertical"
        android:gravity="center_horizontal">

        <TextView 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
         />

        <TextView 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
         />

        <TextView 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
         />

    </LinearLayout>

At the end I want them one after another vertically (one on each row) with horizontal size as their text length (content)

Is this even possible with Linear Layout?

Thanks

EDIT: As @Ajil O answer is working, my own problem still remains. I isolated the main difference.

In my project Im adding the Text Views from the code using Inflate because I have default styling.

Inflating Code:

    final LinearLayout tagAreaView = (LinearLayout) findViewById(R.id.tagsVerticalLineup);
    TextView tag = (TextView) getLayoutInflater().inflate(R.layout.answer_tag, null);

    int tagId = someListArray.size();
    tag.setId(tagId);
    tag.setText(someChangingObject.text);
    tagAreaView.addView(tag, tagId);

Text View answer_tag:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/SelectedTagAnswer" />

style xml SelectedTagAnswer:

<style name="SelectedTagAnswer">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_marginStart">8dp</item>
    <item name="android:layout_marginEnd">16dp</item>
    <item name="android:background">@drawable/selected_answer</item>
    <item name="android:drawablePadding">8dp</item>
    <item name="android:gravity">center_horizontal</item>
    <item name="android:drawableStart">@drawable/ic_cross_round</item>
    <item name="android:elevation">3dp</item>
    <item name="android:paddingBottom">8dp</item>
    <item name="android:paddingEnd">25dp</item>
    <item name="android:paddingStart">15dp</item>
    <item name="android:paddingTop">8dp</item>
</style>

NOTE:

When inserting a simple Text View to xml that uses same style, it works like in @Ajil O answer. Some thing in the inflating process messing it up.


Solution

  • Finally found a solution, So turns out Android wont refresh layout of views with wrap_content once it has been displayed.

    As found in this answer WRAP_CONTENT not working after dynamically adding views

    So my problem was inflating the view and then adding content (text).

    To over come that, I set again the the height and width like so:

        tag.setLayoutParams(new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
    

    Now, if all from Ajil O answer is implemented, it is working!

    Hope this edge case will come handy to someone in the future