25

我有一个在水平滚动窗口中按列显示文本和图像的视图。它重排,因此(至少可能)随着内容的变化而调整自己的大小;当软键盘来来去去并且视图高度发生变化时,它也会重新排列和调整大小(保持大致恒定的区域)。

我发现大多数时候调用requestLayout()有效(从某种意义上说,它确实触发了对我的onMeasure()重载的调用)......但从我的onSizeChanged()处理程序调用时却没有

我可以通过post() ing 一个Runnable来解决这个问题,该 Runnable调用requestLayout()然后post()ed 另一个Runnable调用我的代码的代码,该代码需要在onMeasure()...之后运行,但这似乎有点脆弱(我不想添加延迟,但是我确实想确保我的第二个Runnable确实在 async 之后执行onMeasure())并且可能是因为它通过事件循环进行了太多次,所以屏幕闪烁太多。

是否有某种方式——在一个onSizeChanged()——强制一个onMeasure()(并且可能是另一个)在下一个onDraw()onSizeChanged()之前发生?

4

3 回答 3

1

我建议做一个回电班,也许两个

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

希望这对您有所帮助,祝您工作顺利。

于 2014-05-03T03:06:00.750 回答
0

我通过推迟这样的调用解决了这个问题:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    post(() -> someMethod());
}
于 2017-05-16T10:45:03.487 回答
0

视图实现有一个onlayout回调方法,允许您修改子视图和视图在父布局中的定位。

于 2016-02-02T12:37:15.953 回答