Chcę wymusić ponowne rysowanie / odświeżanie głównego widoku zasobów układu, na przykład metody Activity.onResume (). W jaki sposób mogę to zrobić ?
Przez główny widok układu mam na myśli ten („R.layout.mainscreen” poniżej), który jest wywoływany w moim Activity.onCreate (), na przykład: -
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainscreen);
}
Odpowiedzi:
Aby ściśle odpowiedzieć na pytanie: Użyj unieważnienia ():
Teraz, gdy działanie zostanie wznowione, każdy widok sam się narysuje. Nie powinno być potrzebne wywołanie unieważnienia (). Aby zastosować motyw, upewnij się, że robisz to przed narysowaniem jakiegokolwiek widoku, tj. Przed
setContentView(R.layout.mainscreen);
Dokumentacja dotycząca interfejsu API znajduje się tutaj: http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29
Ponieważ metoda onDraw () działa na już utworzonych widokach, setTheme nie będzie działać. Sam nie mam doświadczenia z motywami, ale myślę, że dwie alternatywne opcje to:
źródło
Próbować
getWindow().getDecorView().findViewById(android.R.id.content).invalidate();
źródło
Wypróbuj
recreate()
to spowoduje odtworzenie tego działania.źródło
onResume
metodzie. To daje mi nieskończoną pętlę: /Rozwiązanie:
Chłopaki, wypróbowałem wszystkie Twoje rozwiązania, ale nie zadziałały, muszę ustawić setVisibility of EditText na VISIBLE i ten EditText powinien być wtedy widoczny w ScrollView , ale nie mogłem odświeżyć widoku głównego, aby odniosło skutek. Rozwiązałem problem, kiedy muszę odświeżyć widok, więc zmieniłem widoczność ScrollView na GONE, a następnie ponownie ustawiłem ją na VISIBLE, aby odniosła skutek i zadziałało. To nie jest dokładne rozwiązanie, ale tylko działało.
źródło
Wywołanie
invalidate()
lubpostInvalidate()
w układzie głównym najwyraźniej NIE gwarantuje, że widoki potomne zostaną przerysowane. W moim konkretnym przypadku moim układem głównym był TableLayout i miał kilka elementów podrzędnych klasy TableRow i TextView. WywołaniepostInvalidate()
, arequestLayout()
nawetforceLayout()
w głównym obiekcie TableLayout, nie spowodowało ponownego narysowania żadnych TextViews w układzie.W końcu to, co zrobiłem, to rekurencyjne analizowanie układu w poszukiwaniu tych TextViews, a następnie wywoływanie
postInvalidate()
każdego z tych obiektów TextView.Kod można znaleźć na GitHub: https://github.com/jkincali/Android-LinearLayout-Parser
źródło
W przeciwnym razie możesz spróbować również tego -
źródło
Po prostu ustaw widok treści w trybie onresume
setContentView (R.layout.yourview) wewnątrz onResume ..
Przykład:
źródło
Wypróbuj to obejście problemu z motywami:
źródło
Pozwala to na ponowne załadowanie ze zmianami motywu i ukrycie animacji.
źródło
Miałem również ten problem, ale podążając za przykładem Farhana dotyczącym używania
setContentView()
, zrobiłem to.setContentView()
Samo używanie nie wystarczyło. Stwierdziłem, że muszę ponownie wypełnić wszystkie swoje poglądy informacjami. Aby to naprawić, po prostu wyciągnąłem cały kod do innej metody (nazwałem to budowaniem), aw mojejonCreate
metodzie po prostu wywołuję tę kompilację. Teraz za każdym razem, gdy pojawia się moje zdarzenie, w którym chcę, aby moja aktywność się „odświeżyła”, po prostu wywołuję build, podaję nowe informacje (które przekazuję jako parametry do zbudowania) i mam odświeżoną aktywność.źródło
Wygląda na to, że jest to znany błąd .
źródło
Nie wiem, czy to jest bezpieczne, czy nie, ale zadziałało. Jakbym wpadł na ten problem i sam spróbował
invalidate()
irequestLayout()
ale bezskutecznie. Więc po prostu ponownie zadzwoniłemonCreate(null)
i zadziałało. Jeśli jest to niebezpieczne, daj mi znać. Mam nadzieję, że to komuś pomoże.źródło
W ten sposób odświeżyłem mój układ
źródło
Aby wyczyścić widok rozszerzający ViewGroup, wystarczy użyć metody
removeAllViews()
Tak po prostu (jeśli masz nazwę ViewGroup
myElement
):źródło
Spróbuj tego
źródło
Nie jestem pewien, czy to dobre podejście, ale za każdym razem dzwonię do tego:
źródło
Po prostu wywołaj działanie ponownie, używając intencji. Na przykład, aby odświeżyć układ MainActivity, wykonaj następujące czynności:
źródło