145 votes

Comment ajouter un TextView à LinearLayout dans Android ?

J'essaie d'ajouter TextViews à ma mise en page définie par xml dans le code. Je dispose d'une feuille de calcul xml, dans laquelle de nombreuses Views sont définis. Mais je dois ajouter quelques vues dans le code, donc je crée un fichier LinearLayout dans la feuille 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>

Et dans cette mise en page, j'aime ajouter mes 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);

Mais je ne reçois que le message d'erreur suivant :

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

Comment puis-je le faire ?

Merci pour votre aide. Martin

0 votes

Sur quelle ligne se trouve cette exception ? Elle doit provenir du cast LinearLayout, êtes-vous sûr que la variable linearLayout est un LinearLayout et non un TextView ? De plus, vous ne devriez pas spécifier l'Id puisque vous ne pouvez pas garantir qu'il sera unique.

1 votes

Vous avez raison, linearLayout est un TextView, mais pourquoi ? Je l'ai défini dans le fichier xml comme un LinearLayout ...

1 votes

Assurez-vous que vous opérez réellement sur le xml indiqué ci-dessus. Est-ce que setContentView(R.layout.your_xml_layout); charger vraiment le bon xml ? Avez-vous d'autres mises en page xml où vous utilisez android:id="@+id/info" qui se trouve être un TextView ?

111voto

Ben Points 3324

Essayez d'utiliser

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

Assurez-vous également que les paramètres de disposition que vous créez sont LinearLayout.LayoutParams...

0 votes

Il y a à nouveau une exception, car findViewById renvoie un TextView. Mais pourquoi ? Je le récupère avec le LinearLayout id.... que voulez-vous dire par : assurez-vous également que les paramètres de disposition que vous créez sont LinearLayout.LayoutParams... ? ???

0 votes

Pourquoi cela changerait-il quelque chose ? Tout ce qu'il fait, c'est de lancer plus tôt que tard, ce qui devrait avoir le même effet.

77voto

Pushpendra Kuntal Points 1764

Hey j'ai vérifié votre code, il n'y a pas d'erreur sérieuse dans votre code. c'est un code complet :

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>

c'est 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);
    }
}

copiez ce code, et exécutez-le. il est complètement sans erreur. prenez soin...

0 votes

Et si je voulais avoir le TextView suivant : <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" />

1 votes

+1. Cette réponse est bien meilleure que celle de @Ben car elle contient un exemple de LayoutParams et de la manière dont le reste des propriétés de l'élément TextView est initialisé. Ceci devrait être noté comme une réponse.

23voto

Deepak Points 977

Vous pouvez ajouter un TextView à votre disposition linéaire de manière programmatique comme ceci :

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

0 votes

Qu'est-ce que MyClass.this ? Je suis novice en matière de développement Android. Suis-je censé remplacer "MyClass" par le nom de la classe de mon fragment ?

1 votes

MyClass.this est un contexte et une vue de texte prend dans un contexte

2 votes

Juste pour clarifier : MyClass.this dans la plupart des cas, est identique à this . Vous devez toutefois spécifier le nom de la classe si vous vous trouvez dans une classe imbriquée et que vous souhaitez accéder à l'instance de la classe "extérieure", ce qui est très courant lors de la définition de callbacks pour les événements dans Android.

3voto

penguin359 Points 569

Vous devez accéder à la mise en page via sa ressource de mise en page, et non via une ressource d'identification qui n'est pas garantie unique. La référence de la ressource doit ressembler à R.layout.my_cool_layout où votre mise en page XML ci-dessus est stockée dans res/layout/my_cool_layout.xml.

0voto

Zapnologica Points 1296
LinearLayout.LayoutParams layoutParams ;
layoutParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X