我知道有很多类似的问题,但建议的解决方案在我的案例中不起作用
我的问题是什么
我有片段嵌套在活动中。
片段布局包括ViewPager
我的想法是什么?至于我的应用程序不支持格局(这可能会导致一些额外的更改),我的ViewPager
正在从网络加载图像。图像可能安静地大而重,所以我编写了服务器端API有助于将图像转换为服务器上所需的大小,并返回调整大小的图像URL
这有助于摆脱OutOfMemory
错误
但问题是我需要在我的请求中发送ViewPager's
高度和宽度
我在onViewCreated
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mBannerSlider = (AutoScrollViewPager) view.findViewById(R.id.banner_slider);
mBannerSlider.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
mSliderHeight = mBannerSlider.getHeight();
mSliderWidth = mBannerSlider.getWidth();
Toast.makeText(getActivity(),"View " + mSliderHeight + " " + mSliderWidth,Toast.LENGTH_SHORT).show();
}
requestBannerImages(mSliderHeight........);
});
这里的问题是每次更改页面都会调用此方法 当然我可以使用一些辅助变量来确定它是否是第一次 此外,还有一种方法可以使用此活动方法将活动回调发送到片段。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
//Here you can get the size!
}
这种方式的最佳解决方案是什么,也许我可以用另一种方式更好地做到这一点 提前谢谢。
修改
我有足够的视图需要获取尺寸,所以我需要为每个视图添加侦听器,并在第一次测量后删除它?
答案 0 :(得分:1)
我会用树观察者来做。为了避免重复调用,我会在获得值后删除侦听器。这样可以确保您获得尺寸并且不再接到电话。
if (Build.VERSION.SDK_INT < 16) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
我从以下代码中获取了代码:https://stackoverflow.com/a/16190337/2051397
答案 1 :(得分:1)
我理解你的困境,主要是因为我实施了一个多媒体应用程序。然而,在每个视图中设置尺寸或与图标/图像相关的许多UI元素是耗时的。如果不是这样,那么最终会有很多代码执行相同的操作。
在我看来,为了看起来你不必为每个视图设置尺寸。您可以设置视图/ UI的最大高度或/并将 setAdjustViewBound 设置为true,让UI框架处理图像。如果图像很大,则可能会有性能成本,在您的情况下可能不会。
您可以参考setMaxHeight of ImageView上的Google笔记。让我知道您对此的看法,有兴趣知道。