Je veux forcer la vue principale des ressources de mise en page à redessiner / actualiser, par exemple la méthode Activity.onResume (). Comment puis-je faire ceci ?
Par vue de mise en page principale, j'entends celle ('R.layout.mainscreen' ci-dessous) qui est appelée dans mon Activity.onCreate (), comme ceci: -
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainscreen);
}
Réponses:
Pour répondre strictement à la question: utilisez invalidate ():
Désormais, lorsque l'activité reprend, chaque vue se dessine d'elle-même. Aucun appel à invalidate () ne devrait être nécessaire. Pour appliquer le thème, assurez-vous de le faire avant toute vue, c'est-à-dire avant
setContentView(R.layout.mainscreen);
La référence de la documentation de l'API est ici: http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29
Puisque la méthode onDraw () fonctionne sur des vues déjà instanciées, setTheme ne fonctionnera pas. Je n'ai moi-même aucune expérience des thèmes, mais je peux penser que deux options alternatives sont:
la source
Essayer
getWindow().getDecorView().findViewById(android.R.id.content).invalidate();
la source
Si
recreate()
vous essayez , cette activité sera recréée.la source
onResume
méthode. Cela me donne une boucle infinie: /Solution:
Les gars, j'ai essayé toutes vos solutions mais elles n'ont pas fonctionné pour moi, je dois définir setVisibility of EditText sur VISIBLE et cet EditText devrait être visible alors dans ScrollView , mais je n'ai pas pu actualiser la vue racine pour prendre effet. J'ai résolu mon problème, lorsque j'ai besoin d'actualiser la vue, j'ai donc changé la visibilité de ScrollView sur GONE, puis à nouveau la définir sur VISIBLE pour prendre effet et cela a fonctionné pour moi. Ce n'est pas la solution exacte mais cela a seulement fonctionné.
la source
L'appel
invalidate()
oupostInvalidate()
sur la mise en page racine ne garantit apparemment PAS que les vues enfants seront redessinées. Dans mon cas spécifique, ma disposition racine était un TableLayout et avait plusieurs enfants de classe TableRow et TextView. L'appelpostInvalidate()
, ourequestLayout()
mêmeforceLayout()
sur l'objet racine TableLayout, n'a provoqué le redessinage d'aucun TextViews dans la mise en page.Donc, ce que j'ai fini par faire était d'analyser récursivement la mise en page à la recherche de ces TextViews, puis d'appeler
postInvalidate()
chacun de ces objets TextView.Le code peut être trouvé sur GitHub: https://github.com/jkincali/Android-LinearLayout-Parser
la source
Sinon, vous pouvez essayer ceci aussi-
la source
Définissez simplement votre vue de contenu dans onresume
setContentView (R.layout.yourview) dans onResume ..
Exemple:
la source
Essayez cette solution de contournement pour le problème de thème:
la source
Cela vous permet de recharger avec les changements de thème et masque les animations.
la source
J'avais également ce problème, mais en suivant l'exemple de Farhan,
setContentView()
je l'ai fait. l’utilisationsetContentView()
en elle-même n’était cependant pas suffisante. J'ai constaté que je devais repeupler toutes mes opinions avec des informations. Pour résoudre ce problème, je viens de tirer tout ce code vers une autre méthode (je l'ai appelée build) et dans maonCreate
méthode, j'appelle simplement cette build. Désormais, chaque fois que mon événement se produit et que je veux que mon activité se «rafraîchisse», j'appelle simplement build, je lui donne les nouvelles informations (que je transmets en tant que paramètres à construire) et j'ai une activité actualisée.la source
Cela semble être un bogue connu .
la source
Je ne sais pas si c'est sûr ou non, mais cela a fonctionné pour moi. J'ai en quelque sorte rencontré ce problème moi-même et j'ai essayé
invalidate()
,requestLayout()
mais en vain. Alors je viens de m'appeleronCreate(null)
à nouveau et ça a marché. Si cela n'est pas sûr, veuillez me le faire savoir. J'espère que cela aide quelqu'un là-bas.la source
Voici comment j'actualisais ma mise en page
la source
Pour effacer une vue étendant ViewGroup, il vous suffit d'utiliser la méthode
removeAllViews()
Juste comme ça (si vous avez un ViewGroup appelé
myElement
):la source
Essaye ça
la source
Je ne sais pas si c'est une bonne approche, mais j'appelle simplement ceci à chaque fois:
la source
Rappelez simplement l'activité elle-même en utilisant l'intention. Par exemple, pour actualiser la disposition de MainActivity, procédez comme suit:
la source