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


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.


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


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

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

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.


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.


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

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

Hast du das getestet?
mrres1

Ja, habe ich. Und es funktioniert perfekt! Hast du es versucht?
user3509153
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.