2013-01-15 8 views
16

私は、水平方向にスクロールするウィンドウで、テキストとイメージを列に表示するビューを持っています。それはリフローするので、内容が変化すると(少なくとも潜在的に)サイズが変更されます。また、ソフトキーボードが来て動いて視野の高さが変わると、リフローしてサイズを変更します(ほぼ一定の領域を維持します)。私が見つけた何requestLayout()はonSizeChanged()から呼び出されても効果がありません。

は私のonSizeChanged()ハンドラから呼び出されたときにほとんどの時間(それは私のonMeasure()過負荷への呼び出しをトリガしないという意味で)requestLayout()作品を呼び出し...しかしないということでした。

私は requestLayout()と呼ば RunnableonMeasure()後に実行する必要があります私のコードを呼び出した後、 post()編別 Runnable INGの post()によってこの問題を回避することができました...しかし、これは少し壊れやすいようです(私はしないでください遅れを追加したいのですが、私は2番目の Runnableが非同期の後に実行されることを確認したいと思います onMeasure())、イベントループを非常に多く通過するため、画面があまりにも多く点滅するためです。 onSizeChanged()で - - onMeasure()(と、おそらく、他の onSizeChanged())は次の onDraw()の前に起こることを強制する

いくつか方法はありますか?

+6

このコールバックはレイアウトプロセスの一部であるため、 'requestLayout()'を2回目に呼び出すのではなく( 'onSizeChanged()'では動作しません)なぜ正しいサイズを'onMeasure()'? –

+0

私はそれを行います。しかし、高さが変わると、私はリフローします。これは幅を変更するため、 'onMeasure()'を呼び出す必要があります。 –

+1

あなたの質問は、実際に私が今まで持っていた問題の答えをくれました:)あなたのView.postソリューションは、私にとって副作用なしで動作します。ありがとう! –

答えて

0

私はあなたが

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

あなた

を終えたときに必ずコールバック作る機能を実行するためにそれを必要とするときそして、クラスをオーバーロード2

interface ImGonnaTellClassBThatClassAdidFinished(){ 

       void ClassHasFinishedProcessing(String YaySuccess); 

       void ClassHasFailedProcessing();  

       void SomethingWackaDoodleHappened(String SomeShyte);  
       } 

多分、コールバッククラスを作成することをお勧め

 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()); 
} 
関連する問題