2013-01-15 19 views
16

Ho una vista che visualizza testi e immagini in colonne, in una finestra che scorre orizzontalmente. Riflette e quindi (almeno potenzialmente) si ridimensiona quando il suo contenuto cambia; inoltre, scorre e ridimensiona (mantenendo un'area approssimativamente costante) quando la tastiera virtuale viene e viene e l'altezza della vista cambia.requestLayout() non ha alcun effetto quando viene chiamato da onSizeChanged()?

Quello che ho trovato è che chiamando requestLayout() opere (nel senso che esso non innescare una chiamata al mio onMeasure() sovraccarico) la maggior parte del tempo ... ma non quando viene chiamato dal mio onSizeChanged() gestore.

sono stato in grado di ovviare a questo post() ing un Runnable che ha chiamato requestLayout() e poi post() Ed un'altra Runnable che ha chiamato il mio codice che deve essere eseguito dopo il onMeasure() ... ma questo sembra un po 'fragile (non lo faccio voglio aggiungere un ritardo, ma voglio essere sicuro che il mio secondo Runnable si esegua dopo l'asincrono onMeasure() e, forse perché fa tanti passaggi attraverso il ciclo degli eventi, lo schermo lampeggia troppo.

C'è qualche modo - in un onSizeChanged() - per forzare un onMeasure() (e, probabilmente, un altro onSizeChanged()) avvenga prima del prossimo onDraw()?

+6

Invece di chiamare 'requestLayout()' una seconda volta (e non funziona da 'onSizeChanged()', perché questo callback è parte del processo di layout) perché non è sufficiente calcolare la dimensione corretta in 'onMeasure()'? –

+0

Sì, e funziona. Ma quando l'altezza cambia, riflusso - che cambia la larghezza - e quindi devo attivare una chiamata a 'onMeasure()'. –

+1

La tua domanda mi ha effettivamente dato una risposta per un problema che ho avuto, grazie :) La tua soluzione View.post funziona senza effetti collaterali per me. Grazie! –

risposta

0

Vorrei suggerire fare una classe chiamata indietro, forse due

interface ImGonnaTellClassBThatClassAdidFinished(){ 

       void ClassHasFinishedProcessing(String YaySuccess); 

       void ClassHasFailedProcessing();  

       void SomethingWackaDoodleHappened(String SomeShyte);  
       } 

Poi sovraccaricare la classe quando ne avete bisogno per eseguire le funzioni

 public class FunctionA{ 
       ImGonnaTellClassBThatClassAdidFinished someName = new ImGonnaTellClassBThatClassAdidFinished(){ 
       @Override 
       void ClassHasFinishedProcessing(String YaySuccess){ 
       //Well I should Call class B with the info then 
       //Heres Sting YaySuccess, Use it in the right way 
       } 
       void ClassHasFailedProcessing(){ 
       //Well I failed and should let someone know 
       } 
       void SomethingWackaDoodleHappened(String SomeShyte){ 
       //Well Something else happened and I have some info on it 
       } 
     //Dont forget to pass it to the class 
     ClassB doWorkMeow = new ClassB(); 
     doWorkMeow.hereYouGo(someName); 
    } 

assicuratevi di chiamare indietro quando il vostro finito

 class ActivityB(){ 

    public void hereYouGo(ImGonnaTellClassBThatClassAdidFinished finished){ 
    String itWorked = new String("Hooray"); 
    finished.ClassHasFinishedProcessing(itWorked); 
    } 
} 

Spero che questo aiuti, Buona fortuna nel tuo sforzo.

0

L'implementazione vista ha un metodo onlayout richiamata che consente di modificare il punto di vista dei bambini e il posizionamento della vista all'interno del layout genitore ..

0

ho risolto il problema posticipando la chiamata in questo modo:

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    post(() -> someMethod()); 
} 
Problemi correlati