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);
}
149

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:

  1. appel setTheme dans onCreate() à la place, ou
  2. redo setContentView (R. layout.écran principal); à force de retrouver toutes les mise en page.
137
répondu Aleadam 2011-05-13 14:17:43

Essayer getWindow().getDecorView().findViewById(android.R.id.content).invalidate();

34
répondu keyboardsurfer 2011-05-13 12:48:14

Essayer recreate() il sera la cause de cette Activité pour être recréé.

22
répondu Mohanad ALKHOULI 2018-10-02 09:30:29

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);
}
15
répondu Naveed Ahmad 2015-11-03 16:50:50

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

8
répondu jkincali 2014-11-29 22:10:08

sinon vous pouvez essayer aussi -

ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView);
 vg.removeAllViews();
 vg.refreshDrawableState();
7
répondu Datta Kunde 2011-05-13 13:09:59

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();
}
4
répondu Farhan 2013-02-07 20:41:50

essayez cette solution pour le problème de thématisation:

@Override
public void onBackPressed() {
    NavUtils.navigateUpTo(this, new Intent(this,
            MyNeedToBeRefreshed.class));
}
4
répondu Krilivye 2013-02-26 20:26:11
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.

3
répondu Codeversed 2016-01-06 16:30:36

cela semble être un bug connu .

2
répondu Ben Williams 2011-05-13 14:04:29

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é.

2
répondu user3612162 2018-02-26 10:04:22

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.

0
répondu Cai 2015-04-10 14:27:16

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);
0
répondu sivaBE35 2016-10-04 09:52:55

Je ne sais pas si c'est une bonne approche, mais je l'appelle à chaque fois:

setContentView(R.layout.mainscreen);
0
répondu Krzysztof Tkacz 2018-01-25 20:35:51

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));
-4
répondu Anshul Aggarwal 2018-04-08 17:50:47