从onSizeChanged()调用requestLayout()时没有效果?

我有一个视图,在水平滚动窗口中以列显示文本和图像。 它会重新stream动,从而(至less有可能)随着内容的变化而自我调整; 当软键盘出现和视图高度变化时,它也会回stream并resize(保持大致恒定的区域)。

我发现,调用requestLayout()在大多数情况下(从某种意义上说,它确实触发了对onMeasure()重载的调用),但是在我的onSizeChanged()处理程序中调用时不起作用

我可以通过post()方法解决这个问题,调用requestLayout() ,然后post()另一个Runnable调用我的代码,需要在onMeasure()之后运行…但这似乎有点脆弱我不想添加一个延迟,但我确实想确保我的第二个Runnable在async onMeasure()之后执行,也许是因为它在事件循环中传递了很多次,屏幕闪烁太多。

有一种方法 – 在onSizeChanged() – 强制onMeasure() (和,可能,另一个onSizeChanged() )发生在下一个onDraw()之前 ?

Solutions Collecting From Web of "从onSizeChanged()调用requestLayout()时没有效果?"

我build议打电话回来,也许两个

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

希望这会有所帮助,祝你好运。

视图实现有一个onlayoutcallback方法,允许你修改父视图内的子视图和视图的位置。

我通过推迟这样的通话来解决问题:

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