wake-up-neo.com

Wie erzwinge ich eine komplette Layoutansicht?

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);
}
155
MickeyR

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: 

  1. rufen Sie stattdessen setTheme in onCreate () auf oder
  2. wiederholen Sie setContentView (R.layout.mainscreen). das Layout neu erzwingen.
141
Aleadam

getWindow().getDecorView().findViewById(Android.R.id.content).invalidate(); ausprobieren

36
keyboardsurfer

Versuchen Sie es mit recreate(), um diese Aktivität neu zu erstellen.

27

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);
}
17
Naveed Ahmad

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

8
jkincali

Ansonsten können Sie dies auch versuchen-

ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView);
 vg.removeAllViews();
 vg.refreshDrawableState();
7
Datta Kunde

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();
}
4
Farhan

Versuchen Sie diese Problemumgehung für das Theming-Problem:

@Override
public void onBackPressed() {
    NavUtils.navigateUpTo(this, new Intent(this,
            MyNeedToBeRefreshed.class));
}
4
Krilivye
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.

3
Codeversed

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.

2
user3612162

Dies scheint ein bekannter Fehler zu sein.

2
Ben Williams

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);
0
sivaBE35

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.

0
Cai

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()
0
Jack'

Ich bin mir nicht sicher, ob es ein guter Ansatz ist, aber ich rufe das jedes Mal einfach an:

setContentView(R.layout.mainscreen);
0
Krzysztof Tkacz