web-dev-qa-db-fra.com

Comment forcer une mise en page entière Voir rafraîchir?

Je veux forcer la vue principale des ressources de présentation à redessiner/actualiser, par exemple la méthode Activity.onResume (). Comment puis-je faire ceci ? 

Par vue principale, j'entends celui ("R.layout.mainscreen" ci-dessous) appelé dans mon Activity.onCreate (), ainsi:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainscreen);
}
155
MickeyR

Pour répondre strictement à la question: Utilisez invalidate ():

public void invalidate () Depuis: API niveau 1

Invalide la vue entière. Si la vue est visible, onDraw (Canvas) sera appelé ultérieurement. Cela doit être appelé depuis un thread d'interface utilisateur. Pour appeler d'un thread non-UI, appelez postInvalidate ().

ViewGroup vg = findViewById (R.id.mainLayout);
vg.invalidate();

Désormais, lorsque l’activité reprend, chaque vue est dessinée. Aucun appel à invalidate () ne devrait être nécessaire. Pour appliquer le thème, assurez-vous de le faire avant de dessiner une vue, c’est-à-dire avant setContentView(R.layout.mainscreen);

public void setTheme (int resid) Depuis: API niveau 1

Définissez le thème de base pour ce contexte. Notez que cela doit être appelé avant l'instanciation d'une vue dans le contexte (par exemple, avant d'appeler setContentView (View) ou de gonfler (int, ViewGroup)).

La référence de la documentation API est la suivante: 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 d'expérience avec les thèmes moi-même, mais deux options possibles sont: 

  1. appelez setTheme dans onCreate () à la place, ou
  2. rétablir setContentView (R.layout.mainscreen); forcer à ré-instancier toute la mise en page.
141
Aleadam

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

36
keyboardsurfer

Essayez recreate(), cette activité sera recréée.

27

Solution:

Les gars, j'ai essayé toutes vos solutions mais elles n'ont pas fonctionné pour moi. Je dois définir setVisibility de EditText surVISIBLEet cet EditText devrait être visible ensuite dans ScrollView , mais je n'a 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 modifié la visibilité de ScrollView en GONE, puis à nouveau défini sur VISIBLE pour qu'il prenne effet et cela a fonctionné pour moi. Ce n'est pas la solution exacte mais cela n'a fonctionné.

 private void refreshView(){
    mScrollView.setVisibility(View.GONE);
    mScrollView.setVisibility(View.VISIBLE);
}
17
Naveed Ahmad

L'appel de invalidate() ou postInvalidate() sur la disposition racine ne garantit apparemment PAS que les vues des enfants seront redessinées. Dans mon cas spécifique, ma disposition 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 TableLayout racine n'a pas entraîné de redessinage des TextViews de la présentation.

Donc, ce que j'ai fini par faire, c'est d'analyser récursivement la mise en page à la recherche de ces TextViews, puis d'appeler postInvalidate() sur chacun de ces objets TextView.

Le code est disponible sur GitHub: https://github.com/jkincali/Android-LinearLayout-Parser

8
jkincali

Sinon, vous pouvez essayer aussi

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

Il suffit de définir votre vue de contenu dans onresume

setContentView (R.layout.yourview) à l'intérieur du résumé .. 

Exemple:

@Override
public void onResume(){
super.onResume();
setContentView(R.layout.activity_main); 
postIncomeTotals();
}
4
Farhan

Essayez cette solution de contournement pour le problème de thème:

@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);

Cela vous permet de recharger avec les changements de thème et de masquer les animations.

3
Codeversed

J'avais aussi ce problème, mais suivant Farhan, qui a utilisé setContentView(), c'est ce que j'ai fait. Utiliser setContentView() seul n'était cependant pas suffisant. J'ai trouvé que je devais repeupler tous mes points de vue avec des informations. Pour résoudre ce problème, je viens d'extraire tout le code d'une autre méthode (je l'ai appelée build) et dans ma méthode onCreate, j'appelle simplement cette construction. Maintenant, chaque fois que mon événement survient, je veux que mon activité soit "actualisée". J'appelle simplement build, donnez-lui les nouvelles informations (que je transmets comme paramètres à construire) et j'ai une activité actualisée.

2
user3612162

Cela semble être un bug connu .

2
Ben Williams

Voici comment 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
sivaBE35

Je ne sais pas si c'est sûr ou non, mais ça a fonctionné pour moi. J'ai un peu rencontré ce problème moi-même et j'ai essayé invalidate() et requestLayout() mais en vain. Donc, je viens d'appeler ma onCreate(null) encore une fois et cela a fonctionné. Si cela n’est pas sûr, faites-le moi savoir. J'espère que cela aide quelqu'un là-bas.

0
Cai

Pour effacer une vue qui étend ViewGroup, il vous suffit d’utiliser la méthode removeAllViews()

Juste comme ceci (si vous avez un ViewGroup appelé myElement):

myElement.removeAllViews()
0
Jack'

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

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