So fügen Sie LinearLayout in Android eine Textansicht hinzu

128

Ich versuche, TextViewsmein XML-definiertes Layout im Code zu ergänzen . Ich habe ein XML-Blatt, in dem viele Viewsdefiniert sind. Aber ich muss einige Ansichten im Code hinzufügen, also ein LinearLayoutim XML-Sheet erstellen:

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

Und in diesem Layout möchte ich meine hinzufügen 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);

Ich erhalte aber nur folgende Fehlermeldung:

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

Wie kann ich es tun?

Danke für deine Hilfe. Martin

Martin
quelle
Für welche Zeile ist diese Ausnahme? Es muss aus der LinearLayout-Umwandlung stammen. Sind Sie sicher, dass die Variable linearLayout ein LinearLayout und keine Textansicht ist? Außerdem sollten Sie die ID nicht angeben, da Sie nicht garantieren können, dass sie eindeutig ist.
Robby Pond
1
Sie haben Recht, linearLayout ist eine Textansicht, aber warum? Ich habe es in der XML-Datei als LinearLayout definiert ...
Martin
1
Stellen Sie sicher, dass Sie wirklich mit der oben gezeigten XML arbeiten. Wird setContentView(R.layout.your_xml_layout);wirklich die richtige XML geladen? Haben Sie andere XML-Layouts, in denen Sie android:id="@+id/info"TextView verwenden?
Rodja
Ist dieses Problem behoben? Bitte akzeptieren Sie als Antwort oder posten Sie eine.
Talha

Antworten:

105

versuchen Sie es mit

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

Stellen Sie außerdem sicher, dass die von Ihnen erstellten Layoutparameter LinearLayout.LayoutParams ... sind.

Ben
quelle
Es gibt wieder eine Ausnahme, da findViewById eine TextView zurückgibt. Aber wieso? Ich rufe es mit der LinearLayout-ID ab ... was meinst du damit: Stelle auch sicher, dass die Layoutparameter, die du erstellst, LinearLayout.LayoutParams sind ... ???
Martin
Warum sollte das etwas ändern? Alles, was es tut, ist eher früher als später zu wirken, was den gleichen Effekt haben sollte.
Yesennes
69

Hey, ich habe deinen Code überprüft, es gibt keinen schwerwiegenden Fehler in deinem Code. Dies ist der vollständige Code:

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>

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

Kopieren Sie diesen Code und führen Sie ihn aus. es ist völlig fehlerfrei. sich kümmern...

Pushpendra Kuntal
quelle
Was wäre, wenn ich die folgende Textansicht haben wollte:<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. Diese Antwort ist viel besser als die von @ Ben, da sie ein Beispiel für LayoutParams enthält und wie die restlichen Eigenschaften von TextViewinitialisiert werden. Dies sollte als Antwort markiert werden.
Subby
3
Hinweis: In 2015 ist const FILL_PARENT veraltet. Verwenden Sie stattdessen MATCH_PARENT.
Nikita Bosik
22

Sie können TextViewIhrem linearen Layout programmgesteuert Folgendes hinzufügen :

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout);
TextView txt1 = new TextView(MyClass.this);
linearLayout.setBackgroundColor(Color.TRANSPARENT);
linearLayout.addView(txt1);
Deepak
quelle
Was ist MyClass.this? Ich bin neu in der Android-Entwicklung. soll ich den Namen meiner Fragmentklasse durch "MyClass" ersetzen?
Drusepth
1
MyClass.this ist ein Kontext und eine Textansicht nimmt einen Kontext auf
Mihai Bratulescu
2
Nur zur Verdeutlichung: MyClass.thisIn den meisten Fällen ist es dasselbe wie this. Sie müssen jedoch den Namen der Klasse angeben, wenn Sie sich in einer verschachtelten Klasse befinden und auf die Instanz der "äußeren" Klasse zugreifen möchten, was beim Definieren von Rückrufen für die Ereignisse in Android sehr häufig vorkommt.
Drigoangelo
Ich denke, einige Android-Entwickler haben sich daran gewöhnt, den Namen der Klasse dort zu platzieren, wo er benötigt wird, und haben begonnen, ihn überall zu platzieren. Auch MyClass.thisist eine Instanz von MyClass, und es wird nur ein Kontext sein, wenn MyClass Context implementiert (z. B. Aktivität erweitert)
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
quelle
10

Sie sollten etwas Ähnliches verwenden, um TextView dynamisch zu LinearLayout hinzuzufügen:

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 () wird für Fragmente verwendet. Sie können für jede Instanz, in der Sie sich befinden, Kontext oder ähnliches verwenden.

Noir
quelle
3

Sie müssen auf das Layout über die Layoutressource zugreifen, nicht über eine ID-Ressource, die nicht eindeutig eindeutig ist. Die Ressourcenreferenz sollte wie R.layout.my_cool_layout aussehen, wobei Ihr oben genanntes XML-Layout in res / layout / my_cool_layout.xml gespeichert ist.

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

Hier tritt die Ausnahme auf

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

addViewMethode nimmt einen Parameter vom Typ Viewnicht auf TextView. Geben Sie daher das valueTv-Objekt explizit in ein View-Objekt ein.

Daher wäre der korrigierte Code:

((LinearLayout) linearLayout).addView((TextView)valueTV);
user3509153
quelle
Hast du das getestet?
mrres1
Ja, habe ich. Und es funktioniert perfekt! Hast du es versucht?
user3509153