Ich möchte die Ansicht der Hauptlayoutressource zum Neuzeichnen / Aktualisieren erzwingen, z. B. die Activity.onResume () -Methode. Wie kann ich das machen ?
Mit der Hauptlayoutansicht meine ich die ('R.layout.mainscreen' unten), die in meiner Activity.onCreate () aufgerufen wird, wie folgt: -
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainscreen);
}
Antworten:
Um die Frage genau zu beantworten: Verwenden Sie invalidate ():
Wenn die Aktivität fortgesetzt wird, wird jede Ansicht dazu gebracht, sich selbst zu zeichnen. Es sollte kein Aufruf von invalidate () erforderlich sein. Stellen Sie zum Anwenden des Themas sicher, dass Sie dies tun, bevor eine Ansicht gezeichnet wird, dh vorher
setContentView(R.layout.mainscreen);
Die API-Dokumentreferenz finden Sie hier: http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29
Da die onDraw () -Methode für bereits instanziierte Ansichten funktioniert, funktioniert setTheme nicht. Ich habe selbst keine Erfahrung mit Themen, aber zwei alternative Optionen, die ich mir vorstellen kann, sind:
quelle
Versuchen
getWindow().getDecorView().findViewById(android.R.id.content).invalidate();
quelle
Wenn Sie
recreate()
es versuchen , wird diese Aktivität neu erstellt.quelle
onResume
Methode tun muss . Dies gibt mir Endlosschleife: /Lösung:
Leute, ich habe alle Ihre Lösungen ausprobiert, aber sie haben bei mir nicht funktioniert. Ich muss setVisibility von EditText auf VISIBLE setzen. Dieser EditText sollte dann in ScrollView sichtbar sein , aber ich konnte die Stammansicht nicht aktualisieren , um wirksam zu werden. Ich habe mein Problem gelöst, als ich die Ansicht aktualisieren musste, sodass ich die ScrollView-Sichtbarkeit in GONE geändert und sie dann erneut auf VISIBLE gesetzt habe, damit sie wirksam wird, und es hat bei mir funktioniert. Dies ist nicht die genaue Lösung, aber es hat nur funktioniert.
quelle
Das Aufrufen
invalidate()
oderpostInvalidate()
im Root-Layout garantiert anscheinend NICHT, dass untergeordnete Ansichten neu gezeichnet werden. In meinem speziellen Fall war mein Root-Layout ein TableLayout und hatte mehrere untergeordnete Elemente der Klassen TableRow und TextView. Der AufrufpostInvalidate()
, oderrequestLayout()
oder sogarforceLayout()
auf der Root - Objekt Tablelayout verursachte keine Textviews im Layout neu gezeichnet werden.Am Ende habe ich das Layout rekursiv analysiert, nach diesen TextViews gesucht und dann
postInvalidate()
jedes dieser TextView-Objekte aufgerufen.Der Code ist auf GitHub zu finden: https://github.com/jkincali/Android-LinearLayout-Parser
quelle
Ansonsten können Sie dies auch versuchen-
quelle
Stellen Sie einfach Ihre Inhaltsansicht in onresume ein
setContentView (R.layout.yourview) in onResume ..
Beispiel:
quelle
Versuchen Sie diese Problemumgehung für das Themenproblem:
quelle
Auf diese Weise können Sie Themenänderungen neu laden und die Animationen ausblenden.
quelle
Ich hatte auch dieses Problem, aber nach Farhans Vorbild
setContentView()
tat ich genau das. Die VerwendungsetContentView()
allein reichte jedoch nicht aus. Ich stellte fest, dass ich alle meine Ansichten mit Informationen neu füllen musste. Um dies zu beheben, habe ich den gesamten Code auf eine andere Methode gezogen (ich habe ihn Build genannt) und in meineronCreate
Methode diesen Build einfach aufgerufen. Wenn nun mein Ereignis eintritt, dass meine Aktivität "aktualisiert" werden soll, rufe ich einfach build auf, gebe ihm die neuen Informationen (die ich als zu erstellende Parameter übergebe) und ich habe eine aktualisierte Aktivität.quelle
Dies scheint ein bekannter Fehler zu sein .
quelle
Ich weiß nicht, ob das sicher ist oder nicht, aber es hat bei mir funktioniert. Ich bin selbst auf dieses Problem gestoßen und habe es versucht
invalidate()
undrequestLayout()
aber ohne Erfolg. Also habe ich einfach noch einmal angerufenonCreate(null)
und es hat funktioniert. Wenn dies nicht sicher ist, lassen Sie es mich bitte wissen. Hoffe das hilft jemandem da draußen.quelle
So habe ich mein Layout aktualisiert
quelle
Um eine Ansicht zu löschen, die ViewGroup erweitert, müssen Sie nur die Methode verwenden
removeAllViews()
Einfach so (wenn Sie eine ViewGroup haben
myElement
):quelle
Versuche dies
quelle
Ich bin mir nicht sicher, ob es ein guter Ansatz ist, aber ich rufe dies jedes Mal an:
quelle
Rufen Sie einfach die Aktivität selbst mit der Absicht erneut auf. Gehen Sie beispielsweise folgendermaßen vor, um das Layout von MainActivity zu aktualisieren:
quelle