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


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 ...


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...


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);

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);
}

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.


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.


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

-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);

Avez-vous testé cela?
mrres1

Oui j'ai. Et cela fonctionne parfaitement! L'as tu essayé?
user3509153
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.