Comment forcer une mise à jour complète de la vue layout?
je veux forcer la vue principale de la ressource de layout à redessiner / rafraîchir, par exemple L'activité.onResume() la méthode. Comment puis-je faire cela ?
par vue principale, je veux dire celle ('R. layout.mainscreen ' ci-dessous) qui est appelé dans mon activité.onCreate(), comme ceci:-
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainscreen);
}
15 réponses
pour répondre strictement à la question: utiliser invalidate ():
public void invalidate () Depuis: API Niveau 1
invalident toute la vue. Si la vue est visible, onDraw(toile) sera appelé à un moment donné dans le futur. Cela doit être appelé à partir d'un fil UI. Pour appeler à partir d'un thread non-UI, appelez postInvalidate().
ViewGroup vg = findViewById (R.id.mainLayout);
vg.invalidate();
Maintenant, lorsque l'activité reprend, il fait chaque vue pour dessiner lui-même. Aucun appel à invalidate () ne doit être nécessaire. Pour appliquer le thème, Assurez-vous de le faire avant toute vue est dessinée, i.e., avant setContentView(R.layout.mainscreen);
public void setTheme (int residd) Depuis: API Niveau 1
définit le thème de base pour ce contexte. Notez que ceci devrait être appelé avant que toutes les vues soient instanciées dans le contexte (par exemple avant d'appeler setContentView (View) ou inflate (int, ViewGroup)).
la référence API doc 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 pas moi-même d'expérience des thèmes, mais deux options que je peux imaginer sont:
- appel setTheme dans onCreate() à la place, ou
- redo setContentView (R. layout.écran principal); à force de retrouver toutes les mise en page.
Essayer getWindow().getDecorView().findViewById(android.R.id.content).invalidate();
Essayer recreate()
il sera la cause de cette Activité pour être recréé.
Solution:
les gars, j'ai essayé toutes vos Solutions mais elles n'ont pas fonctionné pour moi , je dois mettre setVisibility D'EditText à VISIBLE et cet EditText devrait être visible alors dans ScrollView , mais je n'ai pas été en mesure de rafraîchir la vue racine pour prendre effet. J'ai résolu mon problème, quand j'ai besoin de rafraîchir la vue donc j'ai changé la visibilité de ScrollView à partir et puis à nouveau mettez-le à VISIBLE pour prendre effet et ça a marché pour moi. Ce n'est pas la solution exacte, mais il n'a travaillé.
private void refreshView(){
mScrollView.setVisibility(View.GONE);
mScrollView.setVisibility(View.VISIBLE);
}
appeler invalidate()
ou postInvalidate()
sur la disposition racine ne garantit apparemment pas que les vues des enfants seront redessinées. Dans mon cas particulier, ma mise en page racine était un TableLayout et avait plusieurs enfants de la classe TableRow et TextView. L'appel de postInvalidate()
, ou requestLayout()
ou même forceLayout()
sur L'objet root TableLayout n'a pas provoqué de redessin de TextViews dans le layout.
donc, ce que j'ai fini par faire était d'analyser récursivement la mise en page pour ces TextViews et ensuite appeler postInvalidate()
sur chacun de ces objets TextView.
le code se trouve sur GitHub: https://github.com/jkincali/Android-LinearLayout-Parser
sinon vous pouvez essayer aussi -
ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView);
vg.removeAllViews();
vg.refreshDrawableState();
il suffit de régler votre affichage de contenu dans onresume
setContentView (R. layout.yourview) à l'intérieur de onResume..
exemple:
@Override
public void onResume(){
super.onResume();
setContentView(R.layout.activity_main);
postIncomeTotals();
}
essayez cette solution pour le problème de thématisation:
@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);
cela vous permet de recharger avec des changements de thème et Cache Les animations.
j'avais aussi ce problème mais en suivant L'exemple de Farhan d'utiliser setContentView()
j'ai fait exactement cela. l'utilisation de setContentView()
par lui-même n'était pas suffisante cependant. J'ai constaté que je devais repeupler tous mes points de vue avec de l'information. Pour corriger cela, je viens de retirer tout ce code à une autre méthode (je l'ai appelé build) et dans ma méthode onCreate
Je l'appelle juste build. Maintenant, chaque fois que mon événement se produit que je veux que mon activité "rafraîchir", je viens d'appeler construire, lui donner les nouvelles informations (qui Je passe en paramètres de construire) et j'ai une actualisation de l'activité.
Je ne sais pas si c'est sûr ou pas, mais ça a marché pour moi. Je l'avais rencontré ce problème moi-même et essayé invalidate()
et requestLayout()
, mais en vain. Donc j'ai appelé mon onCreate(null)
encore une fois et ça a marché. Si c'est dangereux, veuillez me le faire savoir. Espérons que cela aide quelqu'un là-bas.
c'est comme ça que je Rafraîchissais ma mise en page
Intent intent = getIntent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);
Je ne sais pas si c'est une bonne approche, mais je l'appelle à chaque fois:
setContentView(R.layout.mainscreen);
il suffit de rappeler l'activité elle-même en utilisant l'intention. Par exemple, pour rafraîchir la mise en page de L'activité principale, faites comme ceci:
startActivity(new Intent(MainActivity.this, MainActivity.class));