7

关于这个问题有很多问题,但大多数都太专业而无法回答我的问题。

我有一个GoogleMap我告诉它把它的相机安装到一定的范围内。也许并不奇怪,我收到一个错误:

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

因此,让我们将这个问题抽象为 any View

这个“布局”事件实际发生在什么时候?onMeasure()例如,没有出现在Activity Lifecycle中。什么时候调用我的布局需要方法是安全的?

4

4 回答 4

16

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

mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 
                    this.getResources().getDisplayMetrics().widthPixels, 
                    this.getResources().getDisplayMetrics().heightPixels, 
                    50));

这是一项活动,而是

mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 
                    50));

这对我有用。

文档

注意:如果要在地图经过布局后移动相机,请仅使用更简单的方法 newLatLngBounds(boundary, padding) 生成 CameraUpdate。在布局期间,API 计算正确投影边界框所需的地图显示边界。相比之下,您可以随时使用由更复杂的方法 newLatLngBounds(boundary, width, height, padding) 返回的 CameraUpdate,甚至在地图进行布局之前,因为 API 会根据您传递的参数计算显示边界。

于 2013-04-25T09:52:43.170 回答
9

要解决更新后的 Maps API 中的这个特殊问题,您应该使用

map.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 50));

对于任何其他视图和较旧的 Maps API,请使用ViewTreeObserver.OnGlobalLayoutListenerSimon 的答案。

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

对于地图片段:

MapFragment.getView().post(new Runnable(){
    run() {
       ...Use the layout params...
    }
}
于 2013-01-20T20:47:57.973 回答
2

我认为您的意思是在显示 UI 后执行某些操作。

使用全局布局监听器对我来说一直很有效。它还具有在布局更改时能够重新测量事物的优点,例如,如果某些内容设置为 View.GONE 或添加/删除子视图。

public void onCreate(Bundle savedInstanceState)
{
     super.onCreate(savedInstanceState);

     // inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is
     LinearLayout mainLayout = (LinearLayout ) this.getLayoutInflater().inflate(R.layout.main, null); 

     // set a global layout listener which will be called when the layout pass is completed and the view is drawn
     mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
     new ViewTreeObserver.OnGlobalLayoutListener() {
          public void onGlobalLayout() {
               // at this point, the UI is fully displayed
          }
     }
 );

 setContentView(mainLayout);

http://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener.html

于 2013-01-20T20:13:59.867 回答
1

我会使用onWindowFocusChanged(boolean)。只需检查活动的窗口是否刚刚获得焦点

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);

    if( hasFocus )
    {
        // Ask for any view size here
    }
}
于 2013-01-20T20:20:57.913 回答