Android:动态创建的NetworkImageView的宽度和高度返回零

Android:动态创建的NetworkImageView的宽度和高度返回零,android,android-volley,Android,Android Volley,我想创建一个水平的图像列表,用户可以动态添加(和删除),除了第一个(它的工作原理类似于添加图像按钮)。用户将单击第一张图片,在其左侧添加更多图片。如下图所示,我创建了一个水平滚动和线性布局,最初有一个NetworkImageView,即图像加法器按钮 xml有: ... <HorizontalScrollView android:id="@+id/horizontal_scroll" android:layout_width=

我想创建一个水平的图像列表,用户可以动态添加(和删除),除了第一个(它的工作原理类似于添加图像按钮)。用户将单击第一张图片,在其左侧添加更多图片。如下图所示,我创建了一个水平滚动和线性布局,最初有一个NetworkImageView,即图像加法器按钮

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>
...
在代码的后面,当我真的想要设置一个图像路径时,我阅读了宽度和高度,如下所示:

int targetW = newView.getWidth();
int targetH = newView.getHeight();
两者都返回0。我在SO中看到了许多解决方案,但没有一个对我有效(在我的代码中,您可能会看到不同方法的剩余部分,我已经尝试了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);
      }
});

希望它能起作用:)

拉希德的答案也能起作用。我发现一个更简单的解决方案是使用视图的post方法。这样可以确保在绘制视图后执行您提供的runnable。因此,您可以执行以下操作

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

如果在屏幕上实际绘制布局之前调用getWidth()和getHeight(),则得到0。请参考此答案,谢谢!我早些时候看到了这个答案。在创建视图并将其添加到布局后,我调用getWidth()和getHeight()。这还不足以在屏幕上绘制它吗?不。您可以使用ViewTreeObserver来确定何时在屏幕上绘制视图,然后将您的图像添加到根视图当我单击“添加图像”视图时,会打开一个对话框,用户会从相机或文件选择意图中选择一张图片。然后我加载刚刚创建的网络映像的路径。因此,在选择和设置所选图片时,布局确实不可见。这会是个问题吗?我可以把视图树观察员放在哪里?请检查我和Rashid发布的答案。我应该在创建图像视图后立即添加这个吗?很遗憾,我不能接受两个答案,因为它们都是正确的。但是,我投了你的票!谢谢别担心。很高兴帮助你。干杯:)
view.post(new Runnable() {
     @Override
     public void run() {
         view.getHeight(); //height is ready
         view.getWidth(); //width is ready
     }
});