Search code examples
javaandroidandroid-layoutlayout-inflaterlayoutparams

Issue Filling Parent View When Inflating Linear Layout


The LinearLayoutOutlined class I'm using is from this answer with only a few small edits for color.

This is what my current activity looks like. There is a horizontal scroll view in the center that I want to fill with items by putting them in the layout_holder. This is the xml layout for the page:

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ControlPanel"
        android:orientation="vertical"
        android:id="@+id/main">

    <HorizontalScrollView 
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:layout_gravity="center"
            android:fillViewport="true">

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

        </LinearLayout>
    </HorizontalScrollView>

    <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom">

        <Button
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="@string/connect_button_title"
                android:id="@+id/button_button"
                android:layout_gravity="start|bottom"
                android:layout_width="0dp"
                android:onClick="connectServer"/>

        <EditText
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:id="@+id/editText"
                android:layout_gravity="end|bottom"
                android:text="@string/default_ip"
                android:layout_width="0dp"/>

    </LinearLayout>
</LinearLayout>

The bellow image is how I want block layouts to be inflated into layout_holder:

enter image description here

And this is model for it

<LinearLayoutOutlined xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/block">

    <ImageView
            android:layout_marginTop="15dp"
            android:layout_height="50dp"
            android:layout_width="50dp"
            android:layout_gravity="top|center"/>

    <LinearLayoutOutlined
            android:orientation="vertical"
            android:layout_width="80dp"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal|fill_vertical"/>

</LinearLayoutOutlined>

However when trying to dynamically add the block layout; I get a different result. This is how I'm trying to inflate the layout:

LayoutInflater layoutInfralte = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.layout_holder);
View block = layoutInfralte.inflate(R.layout.block, null);
linearLayout.addView(block);

This is what it looks like when it gets inflated with a block:

enter image description here

The most nested LinearLayoutOutlined in the block layout is not matching up with the layouts I defined in the model. It's height appears to be zero when it should be the distance from the top of the screen until the top of the "connect" button. Any idea what I'm doing wrong here?


EDIT Took a better screenshot to explain the issue better.


Solution

  • Try to inflate and add View after height of LinearLayout has been measured. Below I reported implementation for onCreate method of your Activity.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_holder);
    
        final LayoutInflater li = LayoutInflater.from(this);
        final LinearLayout layout = (LinearLayout) findViewById(R.id.layout_holder);
    
        layout.post(new Runnable() {
            @Override
            public void run() {
                int height = layout.getMeasuredHeight();
                LinearLayoutOutlined view = (LinearLayoutOutlined) li
                    .inflate(R.layout.block, null);
                view.setMinimumHeight(height);
                layout.addView(view);
            }
        });
    }
    

    This is how it looks on my device:

    enter image description here

    Hope this could help.