Ich möchte, dass die Ansicht der Hauptlayout-Ressource neu gezeichnet/aktualisiert wird, z. B. die Activity.onResume () -Methode. Wie kann ich das machen ?
Mit der Hauptlayoutansicht meine ich die eine ("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);
}
Um die Frage streng zu beantworten: Verwenden Sie invalidate ():
public void invalidate () Seit: API Level 1
Ungültige Ansicht Wenn die Ansicht sichtbar ist, wird onDraw (Canvas) irgendwann in der Zukunft aufgerufen. Dies muss von einem UI-Thread aus aufgerufen werden. Rufen Sie postInvalidate () auf, um von einem Nicht-UI-Thread aufzurufen.
ViewGroup vg = findViewById (R.id.mainLayout);
vg.invalidate();
Wenn die Aktivität nun wieder aufgenommen wird, wird jede Ansicht gezeichnet. Es sollte kein Aufruf zu invalidate () erforderlich sein. Stellen Sie sicher, dass Sie das Design anwenden, bevor Sie eine Ansicht zeichnen, d. H. Vor setContentView(R.layout.mainscreen);
.
public void setTheme (int resid) Seit: API Level 1
Legen Sie das Basisdesign für diesen Kontext fest. Beachten Sie, dass dies aufgerufen werden sollte, bevor Ansichten im Kontext instanziiert werden (z. B. vor dem Aufruf von setContentView (View) oder Inflate (int, ViewGroup)).
Die API-Dokumentreferenz ist hier: http://developer.Android.com/reference/Android/view/ContextThemeWrapper.html#setTheme%28int%29
Da die onDraw () -Methode bereits für instantiierte Views funktioniert, funktioniert setTheme nicht. Ich habe selbst keine Erfahrung mit Themen, aber zwei Alternativen, die ich mir vorstellen kann, sind:
getWindow().getDecorView().findViewById(Android.R.id.content).invalidate();
ausprobieren
Versuchen Sie es mit recreate()
, um diese Aktivität neu zu erstellen.
Lösung:
Jungs, ich habe alle Ihre Lösungen ausprobiert, aber sie funktionierten nicht für mich. Ich muss setVisibility von EditText aufVISIBLEsetzen und dieser EditText sollte dann in ScrollView sichtbar sein, aber ich konnte die Root-Ansicht nicht aktualisieren, um wirksam zu werden. Ich löste mein Problem, wenn ich die Ansicht aktualisieren musste, also habe ich die ScrollView-Sichtbarkeit in GONE geändert und dann wieder auf VISIBLE gesetzt, um wirksam zu werden, und es hat für mich funktioniert. Dies ist nicht die exakte Lösung, aber es hat nur funktioniert.
private void refreshView(){
mScrollView.setVisibility(View.GONE);
mScrollView.setVisibility(View.VISIBLE);
}
Das Aufrufen von invalidate()
oder postInvalidate()
im Stammlayout garantiert anscheinend NICHT, dass untergeordnete Ansichten neu gezeichnet werden. In meinem speziellen Fall war mein Stammlayout ein TableLayout und hatte mehrere Kinder der Klassen TableRow und TextView. Beim Aufruf von postInvalidate()
oder requestLayout()
oder sogar forceLayout()
für das TableLayout-Stammobjekt wurden keine TextViews im Layout neu gezeichnet.
Am Ende habe ich also rekursiv das Layout analysiert, nach diesen TextViews gesucht und dann postInvalidate()
für jedes dieser TextView-Objekte aufgerufen.
Der Code ist auf GitHub zu finden: https://github.com/jkincali/Android-LinearLayout-Parser
Ansonsten können Sie dies auch versuchen-
ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView);
vg.removeAllViews();
vg.refreshDrawableState();
Setzen Sie einfach Ihre Inhaltsansicht in einen Lebenslauf
setContentView (R.layout.yourview) in onResume ..
Beispiel:
@Override
public void onResume(){
super.onResume();
setContentView(R.layout.activity_main);
postIncomeTotals();
}
Versuchen Sie diese Problemumgehung für das Theming-Problem:
@Override
public void onBackPressed() {
NavUtils.navigateUpTo(this, new Intent(this,
MyNeedToBeRefreshed.class));
}
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);
Auf diese Weise können Sie die Änderungen des Designs erneut laden und die Animationen ausblenden.
Ich hatte auch dieses Problem, aber nachdem ich Farhans Führung von setContentView()
verwendet hatte, tat ich genau das. Die Verwendung von setContentView()
allein war jedoch nicht ausreichend. Ich fand, dass ich alle meine Ansichten mit Informationen erneut auffüllen musste. Um das Problem zu beheben, habe ich den gesamten Code zu einer anderen Methode (ich nannte sie build) herausgezogen, und in meiner onCreate
-Methode nenne ich diesen Build einfach. Immer wenn mein Ereignis auftritt, dass meine Aktivität "aktualisiert" werden soll, rufe ich einfach build auf, gebe ihm die neuen Informationen (die ich als zu übergebende Parameter übergeben werde) und ich habe eine erneuerte Aktivität.
Dies scheint ein bekannter Fehler zu sein.
So habe ich mein Layout aktualisiert
Intent intent = getIntent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);
Ich weiß nicht, ob das sicher ist oder nicht, aber es hat für mich funktioniert. Ich bin irgendwie auf dieses Problem gestoßen und habe invalidate()
und requestLayout()
versucht, aber ohne Erfolg. Also habe ich meine onCreate(null)
noch einmal angerufen und es hat funktioniert. Wenn dies unsicher ist, lass es mich wissen. Hoffe, das hilft jemandem da draußen.
Um eine Ansicht zu löschen, die ViewGroup erweitert, müssen Sie nur die Methode removeAllViews()
verwenden.
Genau so (wenn Sie eine ViewGroup mit dem Namen myElement
haben):
myElement.removeAllViews()
Ich bin mir nicht sicher, ob es ein guter Ansatz ist, aber ich rufe das jedes Mal einfach an:
setContentView(R.layout.mainscreen);