Cómo agregar un TextView a LinearLayout en Android

129

Estoy tratando de agregar TextViewsa mi diseño definido en xml en el código. Tengo una hoja xml, donde Viewsse definen muchos . Pero tengo que agregar algunas vistas en el código, así que crea una LinearLayouten la hoja xml:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:id="@+id/info"
android:layout_height="wrap_content" 
android:orientation="vertical">
</LinearLayout>

Y en este diseño, me gusta agregar mi TextView:

    View linearLayout =  findViewById(R.id.info);
    //LinearLayout layout = (LinearLayout) findViewById(R.id.info);


    TextView valueTV = new TextView(this);
    valueTV.setText("hallo hallo");
    valueTV.setId(5);
    valueTV.setLayoutParams(new LayoutParams(
            LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT));

    ((LinearLayout) linearLayout).addView(valueTV);

Pero solo recibo el siguiente mensaje de error:

: java.lang.ClassCastException: android.widget.TextView

¿Cómo puedo hacerlo?

Gracias por tu ayuda. Martín

Martín
fuente
¿Para qué línea es esa excepción? Debe ser del reparto LinearLayout, ¿está seguro de que la variable linearLayout es LinearLayout y no TextView? Además, no debe especificar el Id, ya que no puede garantizar que sea único.
Robby Pond
1
Tienes razón, linearLayout es un TextView, pero ¿por qué? Lo he definido en el archivo xml como LinearLayout ...
Martin
1
Asegúrese de estar realmente operando en el xml que se muestra arriba. ¿ setContentView(R.layout.your_xml_layout);Realmente está cargando el xml correcto? ¿Tiene otros diseños xml donde utiliza android:id="@+id/info"que resultan ser TextView?
Rodja
¿Se resolvió este problema? Acepte amablemente como respuesta o publique una.
Talha

Respuestas:

106

intenta usar

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.info);
...
linearLayout.addView(valueTV);

también asegúrese de que los parámetros de diseño que está creando sean LinearLayout.LayoutParams ...

Ben
fuente
nuevamente hay una excepción, porque findViewById devuelve un TextView. ¿Pero por qué? Lo busco con la identificación de LinearLayout ... ¿qué quieres decir con: también asegúrese de que los parámetros de diseño que está creando son LinearLayout.LayoutParams ... ???
Martin
¿Por qué eso cambiaría algo? Todo lo que hace es lanzarlo más temprano que tarde, lo que debería tener el mismo efecto.
yesennes
70

Hola, he comprobado su código, no hay ningún error grave en su código. este es el código completo:

main.xml: -

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

esto es Stackoverflow.java

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

public class Stackoverflow extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        View linearLayout =  findViewById(R.id.info);
        //LinearLayout layout = (LinearLayout) findViewById(R.id.info);

        TextView valueTV = new TextView(this);
        valueTV.setText("hallo hallo");
        valueTV.setId(5);
        valueTV.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));

        ((LinearLayout) linearLayout).addView(valueTV);
    }
}

copie este código y ejecútelo. Está completamente libre de errores. Cuídate...

Pushpendra Kuntal
fuente
¿Qué pasa si quisiera tener el siguiente TextView:<TextView android:id="@+id/tvDInfo3" android:layout_width="0dp" android:layout_height="wrap_content" android:textStyle="bold" android:text="Release Date" android:gravity="center" android:padding="@dimen/dyk_text_pad" android:textColor="#000000" android:textSize="@dimen/info_text_size" android:layout_weight="1" />
Si8
1
+1. Esta respuesta es mucho mejor que @ Ben ya que contiene un ejemplo de LayoutParams y cómo TextViewse inicializa el resto de las propiedades de . Esto debe ser marcado como una respuesta.
Subby
3
Nota: en 2015, const FILL_PARENT está en desuso, debe usar MATCH_PARENT en su lugar.
Nikita Bosik
22

Puede agregar un TextViewa su diseño lineal mediante programación de esta manera:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout);
TextView txt1 = new TextView(MyClass.this);
linearLayout.setBackgroundColor(Color.TRANSPARENT);
linearLayout.addView(txt1);
Deepak
fuente
¿Qué es MyClass.this? Soy nuevo en el desarrollo de Android; ¿se supone que debo sustituir el nombre de mi clase de fragmento por "MyClass"?
drusepth
1
MyClass.this es un contexto y una vista de texto toma contexto
Mihai Bratulescu
2
Solo para aclarar: MyClass.thisen la mayoría de los casos, es lo mismo que this. Sin embargo, debe especificar el nombre de la clase, si está en una clase anidada y desea acceder a la instancia de la clase "externa", que es muy común al definir devoluciones de llamada para los eventos en Android.
drigoangelo
Supongo que algunos desarrolladores de Android se acostumbraron a poner el nombre de la clase donde se necesita y comenzaron a ponerlo en todas partes. Además, MyClass.thises una instancia de MyClass, y solo será un contexto si MyClass implementa Contexto (por ejemplo, extiende la Actividad)
drigoangelo
20
for(int j=0;j<30;j++) {
    LinearLayout childLayout = new LinearLayout(MainActivity.this);
    LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT);
    childLayout.setLayoutParams(linearParams);

    TextView mType = new TextView(MainActivity.this);
    TextView mValue = new TextView(MainActivity.this);

    mType.setLayoutParams(new TableLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT, 1f));
    mValue.setLayoutParams(new TableLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT, 1f));

    mType.setTextSize(17);
    mType.setPadding(5, 3, 0, 3);
    mType.setTypeface(Typeface.DEFAULT_BOLD);
    mType.setGravity(Gravity.LEFT | Gravity.CENTER);

    mValue.setTextSize(16);
    mValue.setPadding(5, 3, 0, 3);
    mValue.setTypeface(null, Typeface.ITALIC);
    mValue.setGravity(Gravity.LEFT | Gravity.CENTER);

    mType.setText("111");
    mValue.setText("111");

    childLayout.addView(mValue, 0);
    childLayout.addView(mType, 0);

    linear.addView(childLayout);
}
vaibhav jain
fuente
10

Debería usar algo similar a esto para agregar TextView a LinearLayout dinámicamente:

LinearLayout linearLayout = getActivity().findViewById(R.id.infoLayout);

TextView valueTV = new TextView(context);
valueTV.setText("hallo hallo");
valueTV.setId(Integer.parseInt("5"));
valueTV.setLayoutParams(new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.FILL_PARENT,
       LinearLayout.LayoutParams.WRAP_CONTENT));

linearLayout.addView(valueTV);

getActivity () se usa para Fragmentos internos, puede usar contexto o cualquier cosa similar por cada instancia en la que se encuentre.

Negro
fuente
3

Debe acceder al diseño a través de su recurso de diseño, no un recurso de identificación que no está garantizado como único. La referencia de recursos debería parecerse a R.layout.my_cool_layout donde su diseño XML anterior se almacena en res / layout / my_cool_layout.xml.

pingüino359
fuente
0
LinearLayout.LayoutParams layoutParams ;
layoutParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
Zapnologica
fuente
-2

Aquí es donde ocurre la excepción

((LinearLayout) linearLayout).addView(valueTV);

addViewEl método toma un parámetro de tipo View, no TextView. Por lo tanto, escriba el objeto valueTv en un objeto View, explícitamente.

Por lo tanto, el código corregido sería:

((LinearLayout) linearLayout).addView((TextView)valueTV);
usuario3509153
fuente
¿Has probado esto?
mrres1
Sí tengo. ¡Y funciona perfectamente! ¿Lo has probado?
user3509153