2010-07-08 15 views
96

Estoy intentando agregar TextViews a mi distribución definida xml en el código. Tengo una hoja xml, donde se definen muchos Views. Pero tengo que añadir algunos puntos de vista en el código, por lo que una cree una LinearLayout en el xml de la ficha técnica:Android: Agregue una vista textual al diseño lineal programáticamente

<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 gustaría añadir 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 sólo recibe el siguiente mensaje de error:

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

¿Cómo puedo hacerlo?

Gracias por su ayuda. Martin

+0

¿Qué línea es esa excepción? Debe ser del elenco LinearLayout, ¿está seguro de que la variable linearLayout es LinearLayout y no TextView? Además, no debería especificar el ID, ya que no puede garantizar que sea único. –

+1

Tiene razón, linearLayout es una vista de texto, pero ¿por qué? Lo he definido en el archivo xml como LinearLayout ... – Martin

+1

Asegúrese de que realmente está 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 usa 'android: id =" @ + id/info "' que resulta ser un TextView? – Rodja

Respuesta

82

tratar de usar

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

También asegúrese de que la disposición params que está creando son LinearLayout.LayoutParams ...

+0

hay de nuevo una excepción, porque findViewById devuelve un TextView. ¿Pero por qué? Lo busco con la identificación de LinearLayout ... ¿Qué quiere decir con: también asegúrese de que los parámetros de diseño que está creando son LinearLayout.LayoutParams ... ??? – Martin

+0

¿Por qué cambiaría eso? Todo lo que hace es lanzar más temprano que tarde, lo que debería tener el mismo efecto. – yesennes

3

Es necesario acceder a través de la disposición de recursos es el diseño, no una recurso de identificación que no está garantizado como único. La referencia del recurso debe verse como R.layout.my_cool_layout donde su disposición XML anterior se almacena en res/layout/my_cool_layout.xml.

56

Hola he comprobado su código, no hay un 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); 
    } 
} 

copia este código, y ejecutarlo. está completamente libre de errores. cuidar ...

+0

¿Qué pasa si yo quería tener la siguiente TextView: ' ' – Si8

+0

1. Esta respuesta es mucho mejor que la de @ Ben, ya que contiene un ejemplo de LayoutParams y cómo se inicializa el resto de las propiedades de 'TextView'. Esto debe marcarse como una respuesta. – Subby

+3

Nota: en 2015 const FILL_PARENT está en desuso, debe usar MATCH_PARENT en su lugar. –

17

Se puede añadir un TextView a su diseño lineal mediante programación como esto:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout); 
TextView txt1 = new TextView(MyClass.this); 
linearLayout.setBackgroundColor(Color.TRANSPARENT); 
linearLayout.addView(txt1); 
+0

¿Qué es MyClass.this? Soy nuevo en el desarrollo de Android; ¿Se supone que debo sustituir el nombre de mi clase de fragmento por "Mi Clase"? – drusepth

+0

MyClass.this es un contexto y una vista de texto lleva en un contexto –

+1

Solo para aclaración: 'MyClass.this', en 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 cuando se definen las devoluciones de llamada para los eventos en Android. – drigoangelo

0
LinearLayout.LayoutParams layoutParams ; 
layoutParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
-2

Aquí es donde se produce la excepción

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

addView método toma en una parámetro del tipo View, no TextView. Por lo tanto, encasilla el objeto valueTv en un objeto Ver, explícitamente.

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

((LinearLayout) linearLayout).addView((TextView)valueTV); 
+0

¿Ha probado esto? – mrres1

+0

Sí, tengo. ¡Y funciona perfectamente! ¿Lo has probado? – user3509153

+0

No, seguro que no. – mrres1

14
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); 
} 
+0

¡Esta debe ser la respuesta aceptada! –

0

Debe usar algo similar a esto para añadir 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 utiliza para el interior Fragmentos, puedes usar contexto o algo similar por cada instancia en la que te encuentres.

Cuestiones relacionadas