2016-02-10 69 views
4

我想創建一個水平的圖像列表,用戶可以動態添加(和刪除),除了第一個(它像添加圖像按鈕一樣)。用戶將點擊第一個在左側添加更多圖片。如下所示,我創建了一個水平滾動和線性佈局,最初有一個NetworkImageView,它是圖像加法器按鈕。Android:動態創建的NetworkImageView的寬度和高度返回ZERO

的XML有:

... 
     <HorizontalScrollView 
      android:id="@+id/horizontal_scroll" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" > 

      <LinearLayout 
       android:id="@+id/linear" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" > 

       <com.android.volley.toolbox.NetworkImageView 
        android:layout_width="100dp" 
        android:layout_height="100dp" 
        android:id="@+id/imageViewAdd" 
        android:adjustViewBounds="true" 
        android:scaleType="centerCrop" 
        android:background="@color/colorAccent" 
        android:contentDescription="@string/description" /> 


      </LinearLayout> 

     </HorizontalScrollView> 
... 
代碼

然後,當用戶點擊該NetworkImageView,我想通過一個在它的一個前添加其他的。

... 
// On create code 
layout = (LinearLayout) findViewById(R.id.linear); 
     imageViewAdd = (NetworkImageView)findViewById(R.id.imageViewAdd); 
     ImageLoader imageLoader = CustomVolleyRequest.getInstance(this.getApplicationContext()) 
       .getImageLoader(); 
     imageLoader.get(Config.IMAGE_PATH_URL, ImageLoader.getImageListener(imageViewAdd, 
       R.drawable.image, android.R.drawable 
         .ic_menu_camera)); 
     imageViewAdd.setImageUrl(Config.IMAGE_PATH_URL, imageLoader); 
     imageViewAdd.setOnClickListener(this); 
     totalImageCount = 0; 
... 
// Create and add new image view 
NetworkImageView newView = new NetworkImageView(this); 
     newView.setId(id); 
     newView.setPadding(2, 2, 2, 2); 
    newView.setScaleType(ImageView.ScaleType.FIT_XY); 
    layout.addView(newView, id); 

    ImageLoader imageLoader = CustomVolleyRequest.getInstance(this.getApplicationContext()) 
      .getImageLoader(); 
    imageLoader.get(Config.IMAGE_PATH_URL, ImageLoader.getImageListener(newView, 
      R.drawable.image, android.R.drawable 
        .ic_dialog_alert)); 
    newView.setImageUrl(Config.IMAGE_PATH_URL, imageLoader); 
    newView.requestLayout(); 
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
      (int) getResources().getDimension(R.dimen.imageview_height), // 100 dp each 
      (int)getResources().getDimension(R.dimen.imageview_width)); 
    newView.setLayoutParams(layoutParams); 
... 

在代碼後來,當我真正想要設置的圖像路徑,我讀的寬度和高度爲:

int targetW = newView.getWidth(); 
int targetH = newView.getHeight(); 

這兩者返回0。我看到很多在SO中的解決方案,但他們都沒有爲我工作(在我的代碼中,您可能會看到不同方法的殘留,我一直在嘗試過去3個小時!)。

任何幫助表示讚賞!

+0

如果調用的getWidth()和getHeight()之前的佈局實際上是在屏幕上繪製,你會得到0,詳見這個答案http://stackoverflow.com/a/3594216/3533289 –

+0

謝謝!我早些時候看到了答案。在創建並將視圖添加到佈局後,我調用getWidth()和getHeight()。這不足以將其繪製在屏幕上嗎? –

+0

不可以。您可以使用ViewTreeObserver來確定在屏幕上確切地繪製視圖,然後將圖像添加到根視圖 –

回答

3

您可以通過使用globalLayoutListener得到的高度和寬度,嘗試做這樣的:

imageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int width = imageView.getWidth(); 
      int height = imageView.getHeight(); 
      //you can add your code here on what you want to do to the height and width you can pass it as parameter or make width and height a global variable 
      imageView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } 
}); 

希望工程:)

+0

我應該在創建圖像視圖後立即添加此答案嗎? –

+0

是的,你可以像你說的那樣添加它 –

+1

這就像一個魅力! –

3

拉希德的回答也行。我發現一個更簡單的解決方案是使用視圖的後處理方法。這確保了您提供的可運行內容將在繪製視圖後執行。所以,你可以做以下

view.post(new Runnable() { 
    @Override 
    public void run() { 
     view.getHeight(); //height is ready 
     view.getWidth(); //width is ready 
    } 
}); 
+1

這太糟糕了,我不能接受兩個答案,因爲兩者都是正確的。但是,我贊成你的!謝謝! –

+0

不用擔心。很高興幫助你。乾杯:) –