2017-03-13 3 views
2

Ich habe CheckedTextView programmgesteuert der linearen Ansicht hinzugefügt. Bitte sehen Sie sich folgenden Code:Android CheckedTextView, wie die Ansicht aktualisiert wird

private LinearLayout linearLayout; 
private CheckedTextView checkedtextview; 
    linearLayout = (LinearLayout) findViewById(R.id.statusView); 
    checkedtextview = new CheckedTextView(ScanStatus.this, null, android.R.attr.listChoiceIndicatorMultiple); 
    checkedtextview.setText(R.string.applications); 
    linearLayout.addView(checkedtextview); 

Später im Code ich habe die checkedtextview wie unten zu aktualisieren:

checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1)); 
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN); 
linearLayout.addView(checkedtextview); 

Aber dies führt zu Absturz mit folgenden Protokoll:

D/Android Runtime (24818): VM herunterfahren E/AndroidRuntime (24818): FATALE AUSNAHME: Haupt E/AndroidRuntime (24818): Prozess: com.beispiel.ashwini.timapp, PID: 24818 E/AndroidRuntime (24818): java.lang. Illegaler Staat xception: Das angegebene Kind hat bereits einen Elternteil. Sie müssen zuerst removeView() für das übergeordnete Element des Kindes aufrufen.

Bitte schlagen Sie mir vor, wie kann ich die Ansicht aktualisieren?

Antwort

1

Sie haben zwei Möglichkeiten. Erstens, wenn Sie einen Verweis auf Ihre checkedtextview die ganze Zeit haben - können Sie es aktualisieren, ohne addView Aufruf:

checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1)); 
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN);. 

Im zweiten Fall Gebrauch Spitze von @ 坚持 远方 Antwort:

linearLayout.removeView(checkedtextview); 
checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1)); 
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN); 
linearLayout.addView(checkedtextview); 
+0

Lassen Sie mich wissen, wenn die erste Variante nicht funktioniert. Vielleicht müssen Sie auch 'checkedtextview.invalidate()' anrufen –

+0

Ich bin Anfänger auf Android. Wie kann ich auf checkedtextview verweisen? Kannst du das bitte mit dem Code-Snippet erklären? – ashkus

+1

Sie haben es bereits, wie ich sehe. Es ist deine private Variable in deiner Klasse. Sobald Sie es am Anfang erstellt haben - Sie haben eine Referenz und müssen nicht jedes Mal neu erstellen, um zu aktualisieren. Sie können die Eigenschaften dieser Ansicht überall in Ihrer Klasse in Runtime ändern und vielleicht die Methode 'invalidate() 'aufrufen, um sie auf dem Bildschirm neu zu zeichnen. –

2

Ich denke, zuerst müssen Sie die Ansicht entfernen, dann aktualisieren Sie sie.

linearLayout.removeView(checkedtextview); 
checkedtextview.setCheckMarkDrawable(getDrawable(R.mipmap.check1)); 
checkedtextview.setChecked(true); 
checkedtextview.setTextColor(Color.GREEN); 
linearLayout.addView(checkedtextview); 
+0

Das funktioniert. Kann ich aktualisieren, ohne die Ansicht zu entfernen? – ashkus

1

Scheint, Sie versuchen, die checkedtextview zweimal hinzuzufügen.

Um die geprüfte Status zu ändern, können Sie die Ansicht von linearLayout wie unten

Entweder linearLayout.getChildAt(position) oder halten einen Verweis von checkedtextview in Ihrer Klasse erhalten und den Status ändern, wann immer Sie wollen.

+0

Ich bin neu bei Android, können Sie bitte mit dem Code erklären? – ashkus

0

können Sie setzen überprüfen

if (checkedtextview.getParent() == null) { 
     // thn add your childview 
    } else { 
     linearLayout.removeAllViews(); 
     //add your child view herer 
    } 

oder wenn Sie wollen nicht, dass alle Kinder von den Eltern entfernen thn können Sie versuchen, diese:

if (checkedtextview.getParent() != null) 
     ((ViewGroup)checkedtextview.getParent()).removeView(checkedtextview); 
    linearLayout.addView(checkedtextview); 
+0

Funktioniert nicht. Dies würde alle Ansichten aus diesem Layout entfernen. Und auch Null-Überprüfung ist nicht korrekt, wenn Eltern Null ist, können Sie keine Ansichten hinzufügen, es wäre NPE. –

+0

if (checkedtextview.getParent()! = Null) ((ViewGroup) checkedtextview.getParent()). RemoveView (checkedtextview); linearLayout.addView (checkedtextview); –

Verwandte Themen