risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come forzare un intero layout Visualizzare l'aggiornamento?

Voglio forzare il ridisegno/aggiornamento della vista della risorsa di layout principale, nel metodo Activity.onResume (). Come posso fare questo ? 

Per la vista di layout principale, intendo quella ('R.layout.mainscreen' di seguito) chiamata nel mio Activity.onCreate (), in questo modo: -

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

Per rispondere in modo rigoroso alla domanda: Utilizzare invalidate ():

public void invalidate () Dal: API Livello 1

Invalida l'intera vista. Se la vista è visibile, onDraw (Canvas) verrà chiamato in futuro. Questo deve essere chiamato da un thread dell'interfaccia utente. Per chiamare da un thread non UI, chiama postInvalidate ().

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

Ora, quando l'attività riprende, rende ogni vista per disegnare se stessa. Non dovrebbe essere necessaria alcuna chiamata per invalidare (). Per applicare il tema, assicurati di farlo prima che venga disegnata qualsiasi vista, cioè prima di setContentView(R.layout.mainscreen);

public void setTheme (int resid) Dal: API Livello 1

Imposta il tema base per questo contesto. Notare che questo dovrebbe essere chiamato prima che qualsiasi vista venga istanziata nel contesto (ad esempio prima di chiamare setContentView (View) o inflate (int, ViewGroup)).

Il documento di riferimento dell'API è disponibile qui: http://developer.Android.com/reference/Android/view/ContextThemeWrapper.html#setTheme%28int%29

Poiché il metodo onDraw () funziona su Views già istanziate, setTheme non funzionerà. Non ho esperienza con temi personali, ma due opzioni alternative che posso pensare sono: 

  1. chiama setTheme in onCreate (), invece, o
  2. ripristina setContentView (R.layout.mainscreen); forzare a ristabilire tutto il layout.
141
Aleadam

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

36
keyboardsurfer

Prova recreate() causerà la ricreazione di questa attività.

27

Soluzione:

Ragazzi ho provato tutte le vostre soluzioni ma non hanno funzionato per me, devo impostare setVisibility di EditText inVISIBLEe questo EditText dovrebbe essere visibile quindi in ScrollView , ma io non è stato in grado di aggiornare la vista radice per avere effetto. Ho risolto il problema, quando ho bisogno di aggiornare la visualizzazione, quindi ho cambiato la visibilità di ScrollView su GONE e poi di nuovo l'impostazione su VISIBLE per avere effetto e ha funzionato per me. Questa non è la soluzione esatta, ma ha funzionato.

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

Apparentemente il invalidate() o postInvalidate() sul layout root NON garantisce che le viste dei bambini vengano ridisegnate. Nel mio caso specifico, il mio layout di root era un TableLayout e aveva diversi figli di classe TableRow e TextView. Chiamare postInvalidate(), o requestLayout() o anche forceLayout() sull'oggetto TableLayout root non ha causato la ridisegnazione di TextView nel layout.

Quindi, ciò che ho finito è stato analizzare in modo ricorsivo il layout alla ricerca di quelle TextViews e quindi chiamare postInvalidate() su ciascuno di quegli oggetti TextView.

Il codice può essere trovato su GitHub: https://github.com/jkincali/Android-LinearLayout-Parser

8
jkincali

Altrimenti puoi provare anche questo-

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

Basta impostare la visualizzazione del contenuto in onresume

setContentView (R.layout.yourview) dentro onResume .. 

Esempio:

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

Prova questa soluzione alternativa per il problema dei temi:

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

Questo ti permette di ricaricare con modifiche ai temi e nasconde le animazioni.

3
Codeversed

Avevo anche questo problema, ma seguendo la guida di Farhan dell'uso di setContentView(), l'ho fatto. tuttavia usare setContentView() da solo non era abbastanza. Ho scoperto che dovevo ripopolare tutte le mie opinioni con informazioni. Per risolvere il problema, ho semplicemente estratto tutto il codice in un altro metodo (l'ho chiamato build) e nel mio metodo onCreate ho chiamato quella build. Ora, ogni volta che si verifica il mio evento che voglio che la mia attività si "aggiorni", chiamo semplicemente build, gli do le nuove informazioni (che passo come parametri da compilare) e ho un'attività aggiornata.

2
user3612162

Questo sembra essere un bug noto .

2
Ben Williams

Questo è come ho usato per aggiornare il mio layout 

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

Non so se questo è sicuro o meno, ma ha funzionato per me. Mi sono imbattuto in questo problema e ho provato invalidate() e requestLayout() ma senza successo. Quindi ho chiamato il mio onCreate(null) tutto da capo e ha funzionato. Se questo non è sicuro, per favore fatemelo sapere. Spero che questo aiuti qualcuno là fuori.

0
Cai

Non sono sicuro che sia un buon approccio, ma lo chiamo ogni volta:

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