ClassCastException beim Hinzufügen von TextView zu LinearLayout
-
11-12-2019 - |
Frage
Ich möchte programmgesteuert hinzufügen LinearLayout
manche TextViews
.Und ich möchte es nutzen LayoutInflater
.Ich habe in meiner Aktivitätslayout-XML-Datei:
<LinearLayout
android:id="@+id/linear_layout"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="vertical"
/>
Ich habe unten einen Aktivitätscode wie diesen geschrieben.
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear_layout);
LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TextView textView = (TextView) inflater.inflate(R.layout.scale, linearLayout, true);
textView.setText("Some text");
linearLayout.addView(textView);
Mein scale.xml
Datei sieht so aus:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:drawableTop="@drawable/unit"
/>
An der Schlange TextView textView = (TextView) inflater.inflate(R.layout.scale, linearLayout, true);
Ich habe eine schwerwiegende Ausnahme wie diese unten.
java.lang.RuntimeException: Unable to start activity ComponentInfo{my.package/my.package.MyActivity}:
java.lang.ClassCastException: android.widget.LinearLayout
Caused by: java.lang.ClassCastException: android.widget.LinearLayout
Wenn ich in einer problematischen Zeile ersetze linearLayout
mit null habe ich keine Ausnahme, aber die android:layout_marginLeft
Und android:layout_marginRight
Von meinem scale.xml
werden ignoriert und ich kann keine Ränder um die hinzugefügte Textansicht sehen.
Ich habe eine Frage gefunden Android:ClassCastException beim Hinzufügen einer Header-Ansicht zu ExpandableListView aber in meinem Fall gibt es in der ersten Zeile eine Ausnahme, bei der ich den Inflator verwende.
Lösung
Wenn Sie die Stammansicht angeben (linearLayout
) im Aufruf an inflater.inflate()
, wird die erweiterte Ansicht automatisch zur Ansichtshierarchie hinzugefügt.Sie müssen also nicht anrufen addView
.Wie Sie bemerkt haben, ist die zurückgegebene Ansicht außerdem die Stammansicht der Hierarchie (a LinearLayout
).Um einen Verweis auf die zu erhalten TextView
selbst, können Sie es dann abrufen mit:
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear_layout);
LayoutInflater inflater = (LayoutInflater) getApplicationContext().
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.scale, linearLayout, true);
TextView textView = (TextView) linearLayout.getChildAt(
linearLayout.getChildCount()-1);
textView.setText("Some text");
Wenn Sie der Ansicht eine geben würden android:id
Attribut in Scale.xml, mit dem Sie es abrufen können
TextView textView = (TextView) linearLayout.findViewById(R.id.text_id);