我有一个片段,我需要在屏幕上测量其视图的位置/宽度/高度,并传递给其他类. 所以我所拥有的是一个功能,它是这样的: private void measureTest(){ v = ourView.findViewById(R.id.someTextField); v.getLoc
所以我所拥有的是一个功能,它是这样的:
private void measureTest(){ v = ourView.findViewById(R.id.someTextField); v.getLocationOnScreen(loc); int w = v.getWidth(); ... SomeClass.passLocation(loc,w); ...
问题是视图的位置/宽度/高度在片段生命周期内没有准备好.
所以,如果我在这些生命周期方法中运行该函数:
onCreateView onViewCreated onStart onResume
我要么得到错误的位置和宽度/高度测量值或0值.
我找到的唯一解决方案是将类似的GlobalLayoutListener添加到mainView
mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { if(alreadyMeasured) mainView.getViewTreeObserver().removeGlobalOnLayoutListener(this); else measureTest(); } });
这可以完成工作..但它只是Yack! IMO.
有没有更好的方法呢?看起来像是一件基本的事情
没有更好的方法.那段代码并不坏!一旦视图布局(我的术语可能有点奇怪)就会在测量后立即触发.这就是Google的Android文档中的 BitmapFun sample(参见ImageGridFragment,第120行).对该特定代码段的评论说明:// This listener is used to get the final width of the GridView and then calculate the // number of columns and the width of each column. The width of each column is variable // as the GridView has stretchMode=columnWidth. The column width is used to set the height // of each view so we get nice square thumbnails.