在应用程序生命周期的什么时候可以/应该使用布局测量?

Maa*_*ten 7 android view

关于这个问题有很多问题,但大多数都太专业了,不能回答我的问题.

我有一个GoogleMap我告诉它适合它的相机到某些界限.也许不是很令人惊讶,我收到一个错误:

java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.

所以让我们把这个问题抽象给任何人View.

这个'布局'事件何时实际发生?onMeasure()例如,未显示在" 活动生命周期"中.何时可以安全地调用我需要布局的方法?

Fra*_*dez 16

正如文档所说,你应该使用它

mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 
                    this.getResources().getDisplayMetrics().widthPixels, 
                    this.getResources().getDisplayMetrics().heightPixels, 
                    50));
Run Code Online (Sandbox Code Playgroud)

这是一项活动,相反

mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 
                    50));
Run Code Online (Sandbox Code Playgroud)

这适合我.

文档

注意:如果要在地图经过布局后用于移动相机,则仅使用更简单的方法newLatLngBounds(boundary,padding)生成CameraUpdate.在布局期间,API会计算正确投影边界框所需的地图显示边界.相比较而言,可以使用通过在任何时间更复杂的方法newLatLngBounds(边界,宽度,高度,填充)返回的CameraUpdate,甚至在地图已布局发生了,因为API从您传递参数计算显示边界.


Maa*_*ten 9

编辑:

要在更新的Maps API中解决此特定问题,您应该使用

map.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 50));
Run Code Online (Sandbox Code Playgroud)

对于任何其他视图和较旧的Maps API

ViewTreeObserver.OnGlobalLayoutListener像西蒙的回答一样使用.

您还可以使用View.post()View消息队列中添加内容,但我不知道布局是否保证在其结尾处发生(有人说它没有,但是即使Groupon + Google也做错了).

对于地图片段:

MapFragment.getView().post(new Runnable(){
    run() {
       ...Use the layout params...
    }
}
Run Code Online (Sandbox Code Playgroud)