Comment ajouter un TextView à LinearLayout dans Android

129

J'essaie d'ajouter TextViewsà ma mise en page définie par XML dans le code. J'ai une feuille xml, où beaucoup de Viewssont définis. Mais je dois ajouter quelques vues dans le code, donc créez un LinearLayoutdans 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 mon 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 reçois uniquement le message d'erreur suivant:

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

Comment puis-je le faire?

Merci pour ton aide. Martin

Martin
la source
Pour quelle ligne cette exception? Elle doit provenir de la distribution 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 car vous ne pouvez pas garantir qu'il sera unique.
Robby Pond
1
Vous avez raison, linearLayout est un TextView, mais pourquoi? Je l'ai défini dans le fichier xml comme un LinearLayout ...
Martin
1
Assurez-vous que vous utilisez vraiment le xml indiqué ci-dessus. Le setContentView(R.layout.your_xml_layout);chargement du bon XML est-il vraiment? Avez-vous d'autres mises en page XML où vous utilisez android:id="@+id/info"qui se trouvent être un TextView?
Rodja
Ce problème est-il résolu? Veuillez accepter comme réponse ou en poster une.
Talha

Réponses:

106

essayez d'utiliser

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

assurez-vous également que les paramètres de mise en page que vous créez sont LinearLayout.LayoutParams ...

Ben
la source
il y a encore une exception, car findViewById renvoie un TextView. Mais pourquoi? Je le récupère avec l'identifiant LinearLayout .... que voulez-vous dire par: assurez-vous également que les paramètres de mise en page que vous créez sont LinearLayout.LayoutParams ... ???
Martin
Pourquoi cela changerait-il quelque chose? Tout ce qu'il fait, c'est lancer le plus tôt possible, ce qui devrait avoir le même effet.
yesennes
70

Hey, j'ai vérifié votre code, il n'y a pas d'erreur grave dans votre code. c'est le 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 totalement exempt d'erreur. prends soin de toi...

Pushpendra Kuntal
la source
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" />
Si8
1
+1. Cette réponse est bien meilleure que celle de @ Ben car elle contient un exemple de LayoutParams et comment le reste des propriétés de TextViewest initialisé. Cela devrait être marqué comme une réponse.
Subby le
3
Remarque: en 2015, const FILL_PARENT est obsolète, vous devez utiliser MATCH_PARENT à la place.
Nikita Bosik
22

Vous pouvez ajouter un TextViewà votre disposition linéaire par programme comme ceci:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout);
TextView txt1 = new TextView(MyClass.this);
linearLayout.setBackgroundColor(Color.TRANSPARENT);
linearLayout.addView(txt1);
Deepak
la source
Qu'est-ce que MyClass.this? Je suis nouveau dans le développement Android; suis-je censé remplacer le nom de ma classe de fragment par "MyClass"?
drusepth
1
MyClass.this est un contexte et une vue de texte prend dans un contexte
Mihai Bratulescu
2
Juste pour clarifier:, MyClass.thisdans la plupart des cas, est le même que this. Vous devez cependant spécifier le nom de la classe, si vous êtes dans une classe imbriquée et que vous souhaitez accéder à l'instance de la classe "externe", ce qui est très courant lors de la définition de rappels pour les événements sous Android.
drigoangelo
Je suppose que certains développeurs Android se sont habitués à mettre le nom de la classe là où c'est nécessaire et ont commencé à le mettre partout. Aussi, MyClass.thisest une instance de MyClass, et ce ne sera un contexte que si MyClass implémente le contexte (par exemple étend l'activité)
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
la source
10

Vous devez utiliser quelque chose de similaire pour ajouter dynamiquement TextView à LinearLayout:

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 () est utilisé pour les fragments internes, vous pouvez utiliser le contexte ou tout autre élément similaire pour chaque instance dans laquelle vous vous trouvez.

Noir
la source
3

Vous devez accéder à la mise en page via sa ressource de mise en page, et non une ressource d'identifiant qui n'est pas garantie unique. La référence de 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.

pingouin359
la source
0
LinearLayout.LayoutParams layoutParams ;
layoutParams= new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
Zapnologica
la source
-2

Voici où se produit l'exception

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

addViewLa méthode prend un paramètre de type View, non TextView. Par conséquent, transtypez l'objet valueTv dans un objet View, explicitement.

Par conséquent, le code corrigé serait:

((LinearLayout) linearLayout).addView((TextView)valueTV);
user3509153
la source
Avez-vous testé cela?
mrres1
Oui j'ai. Et cela fonctionne parfaitement! L'as tu essayé?
user3509153