Blog Archive

Android LayoutInflater - Dynamically Add and Remove Views using Java code

How to manipulate Android screen using predefined XML layouts? This can be done with the help of LayoutInflater. This class is used to instantiate layout XML file into its corresponding View objects. It is never to be used directly -- use getLayoutInflater() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on. For example:

LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);

Click here if you are interested in generating layout views such as Button, TextView, EditText, RadioButton, CheckBox, ToggleButton, etc. programmatically in Java code.

Source for main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
            <LinearLayout android:id="@+id/linearLayout1"
                android:layout_height="wrap_content" android:orientation="horizontal"
                android:layout_width="match_parent">
                <Button android:text="Add View" android:layout_height="wrap_content"
                    android:id="@+id/add" android:layout_width="0dp"
                    android:layout_weight=".5" />
                <Button android:text="Remove View" android:layout_height="wrap_content"
                    android:id="@+id/remove" android:layout_width="0dp"
                    android:layout_weight=".5" />
            </LinearLayout>
            <LinearLayout android:id="@+id/linearLayout2" android:layout_height="wrap_content" 
    android:layout_width="match_parent" android:orientation="vertical">
   </LinearLayout>
</LinearLayout>

Source for hidden.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent" android:id="@+id/hiddenLayout">
    <TextView android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="This is a Text View" android:layout_height="wrap_content"
        android:id="@+id/textView1" android:layout_width="wrap_content" />
    <CheckBox android:text="CheckBox1" android:id="@+id/checkBox1"
        android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <CheckBox android:text="CheckBox2" android:id="@+id/checkBox2"
        android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <CheckBox android:text="CheckBox3" android:id="@+id/checkBox3"
        android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <RadioGroup android:id="@+id/radioGroup1"
        android:layout_height="wrap_content" android:layout_width="wrap_content"
        android:orientation="horizontal">
        <RadioButton android:text="Radio Button1"
            android:layout_width="wrap_content" android:id="@+id/radio0"
            android:layout_height="wrap_content" android:checked="true" />
        <RadioButton android:text="Radio Button2"
            android:layout_width="wrap_content" android:id="@+id/radio1"
            android:layout_height="wrap_content" />
        <RadioButton android:text="Radio Button3"
            android:layout_width="wrap_content" android:id="@+id/radio2"
            android:layout_height="wrap_content" />
    </RadioGroup>

</LinearLayout>

Source for DynamicViews.java

package com.as400samplecode;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

public class DynamicViews extends Activity implements OnClickListener{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        View buttonAdd = findViewById(R.id.add);
        buttonAdd.setOnClickListener(this);

        View buttonRemove = findViewById(R.id.remove);
        buttonRemove.setOnClickListener(this);
    }
   
    public void onClick(View v) {
        switch (v.getId()) {
       
        case R.id.add:
            //Check if the Layout already exists
            LinearLayout hiddenLayout = (LinearLayout)findViewById(R.id.hiddenLayout);
            if(hiddenLayout == null){
                //Inflate the Hidden Layout Information View 
                LinearLayout myLayout = (LinearLayout)findViewById(R.id.linearLayout2);
                View hiddenInfo = getLayoutInflater().inflate(R.layout.hidden, myLayout, false);
                myLayout.addView(hiddenInfo);
            }

            //Get References to the TextView 
            TextView myTextView = (TextView) findViewById(R.id.textView1);
            // Update the TextView Text
            myTextView.setText("This is not the original Text defined in the XML layout !");
            break;
       
        case R.id.remove:
            View myView = findViewById(R.id.hiddenLayout);
            ViewGroup parent = (ViewGroup) myView.getParent();
            parent.removeView(myView);

           
            break;
            // More buttons go here (if any) ...

        }
    }
   
}

Source for AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.as400samplecode"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="13" />

    <application android:icon="@drawable/icon" android:label="@string/app_name" 
  android:theme="@android:style/Theme.Holo.Light">
        <activity android:name=".DynamicViews"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Android dynamic layout using XML

Android dynamic layout using XML

19 comments :

  1. This example is crystal clear - thanks very much! Very useful.

    ReplyDelete
  2. very tough to understand.
    but thanks for guideline

    ReplyDelete
  3. thanks a lot. well done

    ReplyDelete
  4. Thanks for this! I've been trying to understand WHY one uses LayoutInflater and this makes it very clear.

    ReplyDelete
  5. Hi Nice example... thanks a lot

    But while remove we need to check this condition in java code. Otherwise it will throw NullPointerException.

    case R.id.remove:
    View myView = findViewById(R.id.hiddenLayout);
    if(myView != null)
    {
    System.out.println("---------view is not null");
    ViewGroup parent = (ViewGroup) myView.getParent();
    parent.removeView(myView);
    }

    ReplyDelete
    Replies
    1. yes we need to check for the null condition else throws exeption....nice example

      Delete
  6. Thanks for tutorial.. :D
    This is what i want..

    ReplyDelete
  7. Nice post.Give it up. Thanks for share this article. For more visit:android development

    ReplyDelete
  8. Nice post.Give it up. Thanks for share this article. For more visit:android development

    ReplyDelete
  9. Though the name suggest that you E Ledden can only take notes but that is not limited to only text;

    ReplyDelete
  10. Thank you very much. am converting my project from swing to android. am learning android and I needed a code like this. Am adopting it

    Ruth

    ReplyDelete
  11. Hi, if I add multiple items how can I remove a certain one? Thanks

    TibiG

    ReplyDelete
  12. Hey i tried this code its nice but m getting nullPointerException Error when m trying to add dynamic checkboxes in one of my Views, this is code
    public void onClick(View v) {
    switch(v.getId()) {
    case R.id.sens:
    LinearLayout checkboxLayout1 = (LinearLayout) findViewById(R.id.Checkbox_Layout1);
    Dbadapter details = new Dbadapter(this);
    details.open();
    data =details.getDetailedSymps(sympId);
    details.close();
    for (int i = 0; i < data.length; i++) {
    CheckBox cb = new CheckBox(this);
    cb.setTextColor(Color.BLACK);
    cb.setButtonDrawable(id);
    cb.setText(data[i]);
    checkboxLayout1.addView(cb);
    }
    Can you plz tell whats wrong with this?

    ReplyDelete








  13. ArrayList appList = new Gson().fromJson(response, (java.lang.reflect.Type) type);

    for(int i = 0; i < appList.size(); i++) {
    TextView view=new TextView(getBaseContext());
    Integer color = Integer.parseInt("424242", 16)+0xFF000000;
    Integer checkcolor = Integer.parseInt("424242",16)+0xFF000000;
    //view.setTextColor(Color.parseColor("#000000"));
    CheckBox cb = new CheckBox(getBaseContext());
    //cb.setBackgroundColor(checkcolor);

    // cb.setDrawingCacheBackgroundColor(checkcolor);

    cb.setText(appList.get(i).getName());
    int flag=appList.get(i).getFlag();
    if(flag==1)
    {
    cb.setChecked(true);
    }
    appList.get(i).setHtmlid(i+100);
    cb.setId(i+100);
    ll.addView(cb);
    cb.setTextColor(color);

    }
    listLength=appList;

    ReplyDelete
  14. Thanks! This was very helpfull. I used the inflater part only to place some graphica on top of a camera preview. It works like a charm! ;)

    ReplyDelete