在Fragment

时间:2015-06-16 22:04:33

标签: android android-fragments android-viewpager android-imageview android-view

我知道有很多类似的问题,但建议的解决方案在我的案例中不起作用 我的问题是什么 我有片段嵌套在活动中。
片段布局包括ViewPager 我的想法是什么?至于我的应用程序不支持格局(这可能会导致一些额外的更改),我的ViewPager正在从网络加载图像。图像可能安静地大而重,所以我编写了服务器端API有助于将图像转换为服务器上所需的大小,并返回调整大小的图像URL 这有助于摆脱OutOfMemory错误 但问题是我需要在我的请求中发送ViewPager's高度和宽度 我在onViewCreated

中通过ID找到它
@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!
 }

这种方式的最佳解决方案是什么,也许我可以用另一种方式更好地做到这一点 提前谢谢。

修改

我有足够的视图需要获取尺寸,所以我需要为每个视图添加侦听器,并在第一次测量后删除它?

2 个答案:

答案 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笔记。让我知道您对此的看法,有兴趣知道。