Versuchen Sie dynamisch hinzufügen eine TextView zu einem ScrollView-Abstürze bei Verwendung einer XML-layout
Dies ist ein sehr einfaches Beispiel, wo ich eine einzelne ScrollView definiert in R. layout.main. Dann versuche ich Sie dynamisch hinzufügen eine TextView zu es.
Leider ist diese Abstürze.
ScrollView scroll = (ScrollView) this.findViewById(R.id.scrollView1);
TextView tv1 = new TextView(this);
tv1.setText("This is tv1");
scroll.addView(tv1);
setContentView(R.layout.main);
Nun ich kann etwas wie das hier tun:
ScrollView scroll = new ScrollView(this);
TextView tv1 = new TextView(this);
tv1.setText("This is tv1");
scroll.addView(tv1);
setContentView(scroll);
Aber ich würde wirklich gerne in der Lage sein zu definieren, einige Basis-UI-Elemente in XML, dann dynamisch weitere hinzufügen.
Was ist der beste Weg, das zu tun?
- Was ist der stack-trace Aussehen?
- kannst du bitte den log posten cat Absturz. und auch dafür sorgen, dass eine scroll-Ansicht kann nur ein Kind haben zu einem Zeitpunkt.
- Keine Notwendigkeit für einen stack-trace, als es offensichtlich ist.
- Flut von Antworten ist hier mit alle sagen das gleiche. deren Antwort sollte @Mark Biek wählen. Ich Stelle diese Frage 🙂
- In der Theorie ist das eine, die ihm halfen, die meisten. Ich ernsthaft nicht verstehen, warum die Menschen nicht Ihre Augen öffnen und die Aufmerksamkeit auf die Eine Antwort gepostet wurde, Nachricht.
- Ich bin nicht besorgt über das kopieren hier aber über die Tatsache, dass es unnötig viel unnötige Duplikate, weil die Menschen ignorieren Sie diese Meldung, die sagt, dass die Frage beantwortet worden in der Zwischenzeit.
- Ok ich Stimme mit dir überein @Octavian Damiean 🙂
- Damiean ich war nur 54 Sekunden hinter Ihnen, und hatte nicht den
New Answer...
Nachricht. Wie es sich herausstellt, ich denke, unsere beiden Antworten haben einen Wert, als Sie erklären, warum er braucht, umsetContentView
, und ich erläutere die Art der Fehler, die er erlebt. - ich Liebe stackoverflow für dieses Chaos nur. 🙂 Aber ich bin völlig einverstanden, dass es eine Disziplin, bei der Beantwortung so einer sollte gegeben sein Verdienst der Anstrengungen, die er machte. Diese gratis-source-community profitieren alle. Und Jungs, die können so überhaupt beantworten erste oder Letzte In der Ende-Markierung Biek hat sein problem gelöst, welche ist das alleinige Ziel dieser commnuity zu bieten-Lösung, so kann immer Fragen. 🙂 Genießen Sie Alle
- und dave.c bemerkte ich jedes mal den Unterschied und es wurde nicht von 54 sec..:) 🙂 es war dann 2 Minuten 🙂
- Die Zeitstempel auf den Beitrag von Oct ist 13:49:02. Mein post ist 13:49:56. Das ist ein Unterschied von 54 Sekunden.
- wie um zu überprüfen, dass die Zeitstempel. die Zeit, die ich sah Octavian Damiean post war 2 min vor geschrieben von der 2. Rang ..ich bemerkte die 17 Minuten und andere Dinge, die nicht eine bestimmte Zeit-Stempel...
- Ich habe eine komplette Lösung unten. Vielen Dank an alle für die Unterstützung beim lokalisieren des Problems.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist, weil Sie versuchen, Zugriff auf eine Sicht, die bisher nicht analysiert von Android noch.
Beim definieren eines Layouts mit XML -, dann müssen Sie rufen Sie
setContentView
ersten, übergeben Sie die layout-Datei-Referenz, so dass Android Parsen der Datei. Nur dann können Sie den Zugriff auf die Elemente mitfindViewById
.Dass im Grunde bedeutet, dass Sie anrufen sollen
setContentView
vor versuchen, auf ein element Ihres Layouts.Müssen Sie den Aufruf setContentView bevor Sie irgendetwas anderes tun, die mit jedem Blick.
Sollte diese Arbeit.
Einen anderen Weg, dies zu tun,
Können Sie erstellen eine neue
LinearLayout
innerhalb derScrollView
, und legen Sie die id, wie Sie sagen,layoutinside
nun
Dies ist in Ordnung für mich
findViewById
sollte nur aufgerufen werden, nachdem Sie genannt habensetContentView(R.layout.main);
. Derzeitscroll
wirdnull
so würde ich erwarten, es zu werfenNullPointerException
beiscroll.addView(tv1);
ich Habe Ihr problem . Sie müssen die contentView als wie dies vor
Während Sie benötigen, um
setContentView()
am Anfang war ein Teil des Problems, es stellt sich heraus, dass es war nicht die Quelle die Ausnahme.Die eigentliche exception geworfen wurde
IllegalStateException "Scrollview can host only one direct child"
(die Javanator berührt in den Kommentaren)Als ich sah auf die XML-Datei für das ScrollView, sah es so aus. Eclipse fügt automatisch ein LinearLayout, wenn eine ScrollView wird zum layout Hinzugefügt:
So, es gibt zwei Möglichkeiten zur Behebung der Ausnahme:
1) Entfernen Sie das LinearLayout aus dem inneren der ScrollView. Dann, nach dem Umzug mein Aufruf
setContentView
an die Spitze, den code in meiner Frage funktioniert.2) Anstatt die TextView auf den ScrollView, ich kann nur hinzufügen, das TextView zu dem LinearLayout statt so: