Search code examples
androidxmlandroid-layoutandroid-custom-view

Add multiple custom views to layout programmatically


If I for example have empty layout like this:

layout1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
 
</LinearLayout>

And some other Layout like this:

layout2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
 
    <TextView
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView 1" />
 
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button 2" />
 
    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button 3" 
        android:layout_weight="1"/>
 
</LinearLayout>

I would like to add layout2.xml to layout1.xml programmatically. I would need to have multiple different version layout2.xml which I would add when I want. Each one would have different text on TextView and Buttons.

In case of regular Android View I would usually do it similarly like this with addView:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    TextView tv1 = new TextView(this);
    tv1.setText("HELLO");
    my_linear_layout.addView(tv1);

    Button btn2 = new Button(this);
    bt2.setText("WORLD");
    my_linear_layout.addView(btn2);
}

How can I do it if I don't have something simple like TextView or Button, and if I have my own XML defined View?

Would it be possible to somehow put all the views inside adapter like for a ListView and then get it when needed and just call addView on those Views?


Solution

  • You can inflate the layout2.xml file, edit the texts, and add it to the first layout:

    public class MyActivity extends Activity {
    
        private ViewGroup mLinearLayout;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.layout1);
            mLinearLayout = (ViewGroup) findViewById(R.id.linear_layout);
            addLayout("This is text 1", "This is first button", "This is second Button");
        }
    
        private void addLayout(String textViewText, String buttonText1, String buttonText2) {
            View layout2 = LayoutInflater.from(this).inflate(R.layout.layout2, mLinearLayout, false);
    
            TextView textView = (TextView) layout2.findViewById(R.id.button1);
            Button button1 = (Button) layout2.findViewById(R.id.button2);
            Button button2 = (Button) layout2.findViewById(R.id.button3);
    
            textView1.setText(textViewText);
            button1.setText(buttonText1);
            button2.setText(buttonText2);
    
            mLinearLayout.addView(layout2);
        }
    }
    

    You may want to change android:layout_height of the layout2.xml root view to wrap_content.

    If you are using ViewBinding, here is how it would look like for the addLayout function :

    MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), mLinearLayout, false);
    binding.getTextView1().setText(textViewText);
    binding.getButton1().setText(buttonText1);
    binding.getButton2().setText(buttonText2);
    
    mLinearLayout.addView(binding.getRoot());