How to add a TextView to a LinearLayout dynamically in Android?

AndroidTextviewAndroid Linearlayout

Android Problem Overview


I try to add a TextView to a LinearLayout dynamically such as in the following code, but it doesn't appear when I run the application?

setContentView(R.layout.advanced);

m_vwJokeLayout=(LinearLayout) this.findViewById(R.id.m_vwJokeLayout);
m_vwJokeEditText=(EditText) this.findViewById(R.id.m_vwJokeEditText);
m_vwJokeButton=(Button) this.findViewById(R.id.m_vwJokeButton);

TextView tv=new TextView(this);
tv.setText("test");
this.m_vwJokeLayout.addView(tv);

What's the problem?

Android Solutions


Solution 1 - Android

LayoutParams lparams = new LayoutParams(
   LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
TextView tv=new TextView(this);
tv.setLayoutParams(lparams);
tv.setText("test");
this.m_vwJokeLayout.addView(tv);

You can change lparams according to your needs

Solution 2 - Android

Here is a more general answer for future viewers of this question. The layout we will make is below:

enter image description here

Method 1: Add TextView to existing LinearLayout

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.dynamic_linearlayout);

	LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll_example);

	// Add textview 1
	TextView textView1 = new TextView(this);
	textView1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
			LayoutParams.WRAP_CONTENT));
	textView1.setText("programmatically created TextView1");
	textView1.setBackgroundColor(0xff66ff66); // hex color 0xAARRGGBB
	textView1.setPadding(20, 20, 20, 20);// in pixels (left, top, right, bottom)
	linearLayout.addView(textView1);

    // Add textview 2
	TextView textView2 = new TextView(this);
	LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
			LayoutParams.WRAP_CONTENT);
	layoutParams.gravity = Gravity.RIGHT;
	layoutParams.setMargins(10, 10, 10, 10); // (left, top, right, bottom)
	textView2.setLayoutParams(layoutParams);
	textView2.setText("programmatically created TextView2");
	textView2.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
	textView2.setBackgroundColor(0xffffdbdb); // hex color 0xAARRGGBB
	linearLayout.addView(textView2);
}

Note that for LayoutParams you must specify the kind of layout for the import, as in

import android.widget.LinearLayout.LayoutParams;

Otherwise you need to use LinearLayout.LayoutParams in the code.

Here is the xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_example"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff99ccff"
    android:orientation="vertical" >

</LinearLayout>

Method 2: Create both LinearLayout and TextView programmatically

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	// NOTE: setContentView is below, not here

	// Create new LinearLayout
	LinearLayout linearLayout = new LinearLayout(this);
	linearLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
			LayoutParams.MATCH_PARENT));
	linearLayout.setOrientation(LinearLayout.VERTICAL);
	linearLayout.setBackgroundColor(0xff99ccff);

	// Add textviews
	TextView textView1 = new TextView(this);
	textView1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
			LayoutParams.WRAP_CONTENT));
	textView1.setText("programmatically created TextView1");
	textView1.setBackgroundColor(0xff66ff66); // hex color 0xAARRGGBB
	textView1.setPadding(20, 20, 20, 20); // in pixels (left, top, right, bottom)
	linearLayout.addView(textView1);

	TextView textView2 = new TextView(this);
	LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
			LayoutParams.WRAP_CONTENT);
	layoutParams.gravity = Gravity.RIGHT;
	layoutParams.setMargins(10, 10, 10, 10); // (left, top, right, bottom)
	textView2.setLayoutParams(layoutParams);
	textView2.setText("programmatically created TextView2");
	textView2.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
	textView2.setBackgroundColor(0xffffdbdb); // hex color 0xAARRGGBB
	linearLayout.addView(textView2);

	// Set context view
	setContentView(linearLayout);
}

Method 3: Programmatically add one xml layout to another xml layout

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.dynamic_linearlayout);

	LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(
			Context.LAYOUT_INFLATER_SERVICE);
	View view = inflater.inflate(R.layout.dynamic_linearlayout_item, null);
	FrameLayout container = (FrameLayout) findViewById(R.id.flContainer);
	container.addView(view);
}

Here is dynamic_linearlayout.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/flContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</FrameLayout>

And here is the dynamic_linearlayout_item.xml to add:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_example"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff99ccff"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ff66ff66"
        android:padding="20px"
        android:text="programmatically created TextView1" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ffffdbdb"
        android:layout_gravity="right"
        android:layout_margin="10px"
        android:textSize="18sp"
        android:text="programmatically created TextView2" />

</LinearLayout>

Solution 3 - Android

I customized more @Suragch code. My output looks

enter image description here

I wrote a method to stop code redundancy.

public TextView createATextView(int layout_widh, int layout_height, int align,
		String text, int fontSize, int margin, int padding) {

	TextView textView_item_name = new TextView(this);

	// LayoutParams layoutParams = new LayoutParams(
	// LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
	// layoutParams.gravity = Gravity.LEFT;
	RelativeLayout.LayoutParams _params = new RelativeLayout.LayoutParams(
			layout_widh, layout_height);

	_params.setMargins(margin, margin, margin, margin);
	_params.addRule(align);
	textView_item_name.setLayoutParams(_params);

	textView_item_name.setText(text);
	textView_item_name.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
	textView_item_name.setTextColor(Color.parseColor("#000000"));
	// textView1.setBackgroundColor(0xff66ff66); // hex color 0xAARRGGBB
	textView_item_name.setPadding(padding, padding, padding, padding);

	return textView_item_name;

}

It can be called like

createATextView(LayoutParams.WRAP_CONTENT,
			LayoutParams.WRAP_CONTENT, RelativeLayout.ALIGN_PARENT_RIGHT,
			subTotal.toString(), 20, 10, 20);

Now you can add this to a RelativeLayout dynamically. LinearLayout is also same, just add a orientation.

    RelativeLayout primary_layout = new RelativeLayout(this);

	LayoutParams layoutParam = new LayoutParams(LayoutParams.MATCH_PARENT,
			LayoutParams.MATCH_PARENT);

	primary_layout.setLayoutParams(layoutParam);
	
	// FOR LINEAR LAYOUT SET ORIENTATION
	// primary_layout.setOrientation(LinearLayout.HORIZONTAL);
	
	// FOR BACKGROUND COLOR 
	primary_layout.setBackgroundColor(0xff99ccff);

	primary_layout.addView(createATextView(LayoutParams.WRAP_CONTENT,
			LayoutParams.WRAP_CONTENT, RelativeLayout.ALIGN_LEFT, list[i],
			20, 10, 20));
	primary_layout.addView(createATextView(LayoutParams.WRAP_CONTENT,
			LayoutParams.WRAP_CONTENT, RelativeLayout.ALIGN_PARENT_RIGHT,
			subTotal.toString(), 20, 10, 20));

Solution 4 - Android

TextView rowTextView = (TextView)getLayoutInflater().inflate(R.layout.yourTextView, null);
        rowTextView.setText(text);
        layout.addView(rowTextView);

This is how I'm using this:

 private List<Tag> tags = new ArrayList<>();


if(tags.isEmpty()){
        Gson gson = new Gson();
        Type listType = new TypeToken<List<Tag>>() {
        }.getType();
        tags = gson.fromJson(tour.getTagsJSONArray(), listType);
    }



if (flowLayout != null) {
        if(!tags.isEmpty()) {
            Log.e(TAG, "setTags: "+ flowLayout.getChildCount() );
            flowLayout.removeAllViews();
            for (Tag tag : tags) {
                FlowLayout.LayoutParams lparams = new FlowLayout.LayoutParams(FlowLayout.LayoutParams.WRAP_CONTENT, FlowLayout.LayoutParams.WRAP_CONTENT);
                lparams.setMargins(PixelUtil.dpToPx(this, 0), PixelUtil.dpToPx(this, 5), PixelUtil.dpToPx(this, 10), PixelUtil.dpToPx(this, 5));// llp.setMargins(left, top, right, bottom);
                TextView rowTextView = (TextView) getLayoutInflater().inflate(R.layout.tag, null);
                rowTextView.setText(tag.getLabel());
                rowTextView.setLayoutParams(lparams);
                flowLayout.addView(rowTextView);
            }
        }
        Log.e(TAG, "setTags: after "+ flowLayout.getChildCount() );
    }

And this is my custom TextView named tag:

<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"    
android:textSize="10dp"
android:textAllCaps="true"
fontPath="@string/font_light"
android:background="@drawable/tag_shape"
android:paddingLeft="11dp"
android:paddingTop="6dp"
android:paddingRight="11dp"
android:paddingBottom="6dp">

this is my tag_shape:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#f2f2f2" />
<corners android:radius="15dp" />
</shape>

efect:

enter image description here

In other place I'm adding textviews with language names from dialog with listview:

enter image description here

enter image description here

Solution 5 - Android

layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >

  <LinearLayout
      android:id="@+id/layoutTest"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical"
      >
  </LinearLayout>
</RelativeLayout>

class file:

setContentView(R.layout.layout_dynamic);
layoutTest=(LinearLayout)findViewById(R.id.layoutTest);
TextView textView = new TextView(getApplicationContext());

textView.setText("testDynamic textView");
layoutTest.addView(textView);

Solution 6 - Android

If you are using Linearlayout. its params should be "wrap_content" to add dynamic data in your layout xml. if you use match or fill parent then you cannot see the output.

It Should be like this.

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content" android:layout_height="wrap_content">
        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </ListView>
    </LinearLayout>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdhamView Question on Stackoverflow
Solution 1 - Androiduser479211View Answer on Stackoverflow
Solution 2 - AndroidSuragchView Answer on Stackoverflow
Solution 3 - AndroidShihab UddinView Answer on Stackoverflow
Solution 4 - AndroidKrzysztof DziubaView Answer on Stackoverflow
Solution 5 - Androidjeet parmarView Answer on Stackoverflow
Solution 6 - AndroidHari krishna Andhra PradeshView Answer on Stackoverflow