¿Cómo agregar un TextView a LinearLayout dinámicamente en Android?

Intento agregar un TextView a LinearLayout forma dinámica, como en el siguiente código, pero no aparece cuando ejecuto la aplicación.

 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); 

¿Cuál es el problema?

 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); 

Puede cambiar lparams de acuerdo a sus necesidades

Aquí hay una respuesta más general para los espectadores futuros de esta pregunta. El diseño que haremos será a continuación:

enter image description here

Método 1: Agregue TextView a LinearLayout existente

 @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); } 

Tenga en cuenta que para LayoutParams debe especificar el tipo de diseño para la importación, como en

 import android.widget.LinearLayout.LayoutParams; 

De lo contrario, debe usar LinearLayout.LayoutParams en el código.

Aquí está el xml:

   

Método 2: cree tanto LinearLayout como TextView mediante progtwigción

 @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); } 

Método 3: Agregue programáticamente un diseño xml a otro diseño xml

 @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); } 

Aquí está dynamic_linearlayout.xml:

    

Y aquí está el dynamic_linearlayout_item.xml para agregar:

      

Personalicé más código de @Suragch. Mi salida se ve

enter image description here

Escribí un método para detener la redundancia de código.

 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; } 

Se puede llamar como

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

Ahora puede agregar esto a un RelativeLayout dinámicamente. LinearLayout también es lo mismo, solo agrega una orientación.

  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)); 
 TextView rowTextView = (TextView)getLayoutInflater().inflate(R.layout.yourTextView, null); rowTextView.setText(text); layout.addView(rowTextView); 

Así es como estoy usando esto:

  private List tags = new ArrayList<>(); if(tags.isEmpty()){ Gson gson = new Gson(); Type listType = new TypeToken>() { }.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() ); } 

Y esta es mi etiqueta personalizada TextView named:

  

esta es mi tag_shape:

     

efect:

enter image description here

En otro lugar, estoy agregando vistas de texto con nombres de idiomas del diálogo con listview:

enter image description here

enter image description here

diseño :

      

archivo de clase :

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

Si está utilizando Linearlayout. sus parámetros deben ser “wrap_content” para agregar datos dynamics en su diseño xml. si usa el padre coincidente o el de relleno, entonces no puede ver el resultado.

Debería ser así.