Search code examples
androidlayoutviewandroid-linearlayoutlayout-inflater

LayoutInflater not working for Android


I am trying to add a LinearLayout as a child to another LinearLayout component, but it will not show up on the screen at all.

XML:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ReceivedMessage"
android:background="@android:color/holo_blue_light"
android:visibility="visible"
tools:showIn="@layout/content_chat">

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@mipmap/ic_launcher"
    android:id="@+id/ProfilePicture"
    android:layout_weight="1" />

<TextView
    android:text="   Message"
    android:layout_width="305dp"
    android:layout_height="match_parent"
    android:id="@+id/MessageText"
    android:gravity="center_vertical" />
</LinearLayout>

Code:

Button testMessageButton = (Button) findViewById(R.id.TestMessageButton);
    testMessageButton.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View view)
        {
            LinearLayout msgLayout = (LinearLayout) findViewById(R.id.MessageLayout);

            LayoutInflater vi = (LayoutInflater)getBaseContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View v = vi.inflate(R.layout.message_received, msgLayout, false);


            msgLayout.addView(v);
        }
    });

What is causing the component to not appear on the screen?


Solution

  • Your question is not correct but I will answer it in two different ways

    First, if the LinearLayout you want to add is in a different xml file then you can inflate the xml file and add it to parent LinearLayout in your Activity class like this

    Button testMessageButton = (Button) findViewById(R.id.TestMessageButton);
    testMessageButton.setOnClickListener(new View.OnClickListener(){
        public void onClick(View view){
            LinearLayout msgLayout = (LinearLayout) findViewById(R.id.MessageLayout);
    
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            LayoutInflater vi = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View v = vi.inflate(R.layout.message_received, null);
            v.setLayoutParams(params);
    
            msgLayout.addView(v);
        }
    });
    

    I have updated my solution. Part of the problem is in your layout file

    This is the Activity class

    import android.content.Context;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.Button;
    import android.widget.LinearLayout;
    
    public class MainActivity extends AppCompatActivity {
    
    private LinearLayout mainLayout;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mainLayout = (LinearLayout)findViewById(R.id.main_layout);
        Button addChatButton = (Button)findViewById(R.id.add_chat);
        addChatButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                LayoutInflater vi = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                LinearLayout mView = (LinearLayout)vi.inflate(R.layout.test_layout, mainLayout, false);
                mView.setLayoutParams(params);
                mainLayout.addView(mView);
            }
        });
      }
    }
    

    The xml layout file for Activity class

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.inducesmile.mylinear.MainActivity">
    
    <Button
        android:id="@+id/add_chat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="80dp"
        android:text="@string/add_chat"
        android:layout_gravity="center|center_horizontal"/>
    </LinearLayout>
    

    Finally, the layout file that contains the Linearlayout to be inflated and add to the root LinearLayout.

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/ReceivedMessage"
    android:background="@android:color/holo_blue_light"
    android:visibility="visible">
    
    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"
        android:id="@+id/ProfilePicture"
        android:layout_weight="2" />
    
    <TextView
        android:text="@string/message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/MessageText"
        android:layout_weight="7"
        android:paddingTop="14dp"
        android:paddingBottom="14dp"
        android:gravity="center_vertical" />
    
    </LinearLayout>
    

    enter image description here