0

我知道有很多類似的問題,但建議的解決方案不適用於我的情況。
我的問題是什麼。
我有片段嵌套在活動內。
片段佈局包括ViewPager
我的想法是什麼?至於我的應用程序將不支持風景(這可能會導致一些額外的更改),我的ViewPager正在從網絡加載圖像。圖像可以安靜地大和沉重,所以我寫了服務器端API,它有助於將圖像轉換爲在服務器上所需的大小,並返回調整大小的圖像網址。
這將有助於擺脫OutOfMemory錯誤。
但問題是我需要在請求中發送ViewPager's高度和寬度。
我的ID在onViewCreated獲取ViewPager的高度和寬度,像素內只有一次在片段

@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! 
} 

什麼是這種方式的最佳解決方案,也許我可以用另一種方式做得更好。
在此先感謝。

編輯

我有很多的看法,我需要得到的尺寸,所以我需要監聽器添加到每個視圖,並且第一次測量之後將其刪除?

回答

1

我會用樹觀察者來做。爲了避免重複的調用,我會在獲取值時刪除監聽器。這可以保證你會得到尺寸,而且不會再打電話了。

if (Build.VERSION.SDK_INT < 16) { 
    v.getViewTreeObserver().removeGlobalOnLayoutListener(listener); 
} else { 
    v.getViewTreeObserver().removeOnGlobalLayoutListener(listener); 
} 

我把代碼:https://stackoverflow.com/a/16190337/2051397

+0

謝謝,這個工程。我有很多觀點,我需要獲取高度和寬度,請參閱編輯。 – CROSP

1

我理解你的困境,主要是因爲我實現了一個多媒體應用程序。但是,在每個視圖中設置尺寸或與圖標/圖像相關的許多UI元素都很耗時。如果不是這樣,那麼你最終會有很多代碼做同樣的事情。

在我看來,你不必爲每個視圖設置尺寸,爲了外觀。您可能會設置設置視圖/ UI的最大高度或/並將setAdjustViewBound設置爲true,讓UI框架處理圖像。如果圖像很大,性能可能會降低,但在您的情況下可能不會。

您可以參考Google筆記setMaxHeight of ImageView。讓我知道你對此的看法,有興趣知道。