【问题标题】:requestLayout() has no effect when called from onSizeChanged()?从 onSizeChanged() 调用 requestLayout() 没有效果?
【发布时间】:2017-05-16 18:45:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 而不是第二次调用requestLayout()(它在onSizeChanged() 中不起作用,因为这个回调是布局过程的一部分)你为什么不简单地在@ 中计算正确的大小987654338@?
  • 我愿意,而且行得通。但是当高度发生变化时,我会重排——这会改变宽度——因此需要触发对onMeasure()的调用。
  • 您的问题实际上为我刚刚遇到的问题提供了答案,谢谢 :) 您的 View.post 解决方案对我没有任何副作用。谢谢!
  • 关于您的问题:为什么不从 onMeasure 方法内部调用第二个 Runnable 中的代码?
  • 它不仅来自 onSizeChanged,它不起作用。我尝试从我的 setImageDrawable 方法调用 requestLayout 以导致 onMeasure 并且它不起作用。发布它虽然修复了它。

标签: android android-layout


【解决方案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);
     }
 }

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我通过这样推迟通话解决了这个问题:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-18
        • 1970-01-01
        • 2016-01-05
        • 2014-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多