2013-01-15 38 views
16

我有一個視圖,在水平滾動窗口中以列顯示文本和圖像。它會重新流動,因此(至少有可能)隨着其內容的變化而重新調整自身;它還會在軟鍵盤進出和視圖高度發生變化時重排和調整大小(保持大致恆定的區域)。從onSizeChanged()調用requestLayout()時沒有效果?

我發現那是什麼調用requestLayout()作品(在這個意義上,它並觸發對我onMeasure()超載的調用)的大部分時間......但從我onSizeChanged()處理程序調用時。

我能夠post()解決此一荷蘭國際集團是RunnablerequestLayout()然後post() ED另一個Runnable調用我的代碼需要onMeasure()後運行...但是這似乎有點脆弱的(我不知道想要添加一個延遲,但我確實希望確保我的第二個Runnable在異步onMeasure()後確實執行),也許是因爲它在事件循環中傳遞了很多次,屏幕閃爍過多。

是否有某種方式 - 在onSizeChanged() - 以強制onMeasure()(和可能,另一個onSizeChanged())到下一個onDraw()之前發生的呢?

+6

而不是再次調用'requestLayout()'(並且它不能從'onSizeChanged()'工作,因爲這個回調是佈局過程的一部分),爲什麼不直接計算正確的大小'onMeasure()'? –

+0

我這樣做,那是有效的。但是,當高度發生變化時,我會重新調整寬度,從而需要觸發'onMeasure()'調用。 –

+1

您的問題實際上給了我一個我剛剛遇到的問題的答案,謝謝:)您的View.post解決方案對我無任何副作用。謝謝! –

回答

0

我建議作出回撥類,也許兩個

interface ImGonnaTellClassBThatClassAdidFinished(){ 

       void ClassHasFinishedProcessing(String YaySuccess); 

       void ClassHasFailedProcessing();  

       void SomethingWackaDoodleHappened(String SomeShyte);  
       } 

然後超負荷類,當你需要它來執行功能

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

確保你打電話回來時,你完成

 class ActivityB(){ 

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

希望這會有所幫助,祝你好運。

0

視圖實現了我推遲這樣的電話解決了這個問題一個onlayout回調方法,可以讓你修改子視圖和父佈局內的視圖的定位..

0

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