Come aggiungere un TextView a LinearLayout in Android


129

Sto cercando di aggiungere TextViewsal mio layout definito da xml nel codice. Ho un foglio xml, in cui molti Viewssono definiti. Ma devo aggiungere alcune viste nel codice, quindi crea una a LinearLayoutnel foglio 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>

E in questo layout, mi piace aggiungere il mio 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);

Ma ricevo solo il seguente messaggio di errore:

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

Come posso farlo?

Grazie per il tuo aiuto. balestruccio


Per quale linea è prevista questa eccezione? Deve provenire dal cast di LinearLayout, sei sicuro che la variabile linearLayout sia un LinearLayout e non un TextView? Inoltre, non dovresti specificare l'ID poiché non puoi garantire che sarà unico.
Robby Pond,

1
Hai ragione, linearLayout è un TextView, ma perché? L'ho definito nel file xml come LinearLayout ...
Martin

1
Assicurati di operare davvero sul file XML mostrato sopra. Sta setContentView(R.layout.your_xml_layout);davvero caricando l'xml giusto? Hai altri layout xml in cui utilizzi android:id="@+id/info"che sembrano essere TextView?
Rodja,

Questo problema è stato risolto? Si prega di accettare come risposta o pubblicarne uno.
Talha,

Risposte:


106

prova ad usare

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

assicurati inoltre che i parametri di layout che stai creando siano LinearLayout.LayoutParams ...


c'è ancora un'eccezione, perché findViewById restituisce un oggetto TextView. Ma perché? Lo prendo con l'id LinearLayout .... che cosa vuoi dire con: assicurati anche che i parametri di layout che stai creando siano LinearLayout.LayoutParams ... ???
Martin,

Perché ciò cambierebbe qualcosa? Tutto ciò che fa è lanciato prima piuttosto che dopo, il che dovrebbe avere lo stesso effetto.
yesennes,

70

Ehi, ho controllato il tuo codice, non c'è nessun errore grave nel tuo codice. questo è il codice 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>

questo è 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 questo codice ed eseguilo. è completamente privo di errori. stai attento...


E se volessi avere il seguente 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. Questa risposta è molto migliore di quella di @ Ben poiché contiene un esempio di LayoutParams e come TextViewviene inizializzato il resto delle proprietà di . Questo dovrebbe essere contrassegnato come una risposta.
Subby,

3
Nota: nel 2015 const FILL_PARENT è obsoleto, devi invece utilizzare MATCH_PARENT.
Nikita Bosik,

22

Puoi aggiungere a TextViewal tuo layout lineare programmaticamente in questo modo:

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

Cos'è MyClass.this? Sono nuovo nello sviluppo di Android; dovrei sostituire il nome della mia classe di frammento con "MyClass"?
drusepth,

1
MyClass.this è un contesto e una visualizzazione testuale assume un contesto
Mihai Bratulescu,

2
Solo per chiarimenti:, MyClass.thisnella maggior parte dei casi, è uguale a this. È necessario specificare, tuttavia, il nome della classe, se ci si trova in una classe nidificata e si desidera accedere all'istanza della classe "esterna", che è molto comune quando si definiscono i callback per gli eventi in Android.
drigoangelo,

Immagino che alcuni sviluppatori Android si siano abituati a mettere il nome della classe dove è necessario e hanno iniziato a metterlo ovunque. Inoltre, MyClass.thisè un'istanza di MyClass, e sarà solo un contesto se MyClass implementa il contesto (ad esempio estende l'attività)
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);
}

10

Dovresti usare qualcosa di simile a questo per aggiungere TextView a LinearLayout in modo dinamico:

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 () è usato per i frammenti interni, puoi usare il contesto o qualcosa di simile per ogni istanza in cui ti trovi.


3

È necessario accedere al layout tramite la sua risorsa di layout, non una risorsa id che non è garantita unica. Il riferimento alla risorsa dovrebbe apparire come R.layout.my_cool_layout dove il layout XML sopra è memorizzato in res / layout / my_cool_layout.xml.


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

-2

Ecco dove si verifica l'eccezione

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

addViewIl metodo accetta un parametro di tipo View, no TextView. Pertanto, digitare in modo esplicito l'oggetto valueTv in un oggetto View.

Pertanto, il codice corretto sarebbe:

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

Hai provato questo?
mrres1,

Sì. E funziona perfettamente! L'hai provato?
user3509153
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.