为什么我的膨胀ImageView的高度和宽度为0?

时间:2014-11-28 02:57:12

标签: java android android-layout user-interface imageview

这是我的布局文件,我从图像视图中充气。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.Tamaritz.dailyselfie.MainActivity" >
<ImageView
    android:id="@+id/selfieImage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/abc_ab_bottom_solid_dark_holo" />
<TextView
    android:id="@+id/timestamp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/selfieImage"
    />

这是我的基础适配器中的代码,它将此布局文件扩展为具有视图持有者类(内部静态类)的视图对象

    static class ViewHolder {
            ImageView selfieImage;
            TextView timestamp;
            public ViewHolder(View selfieLayout) {
                       selfieImage = (ImageView) selfieLayout.findViewById(R.id.selfieImage);
                      timestamp = (TextView) selfieLayout.findViewById(R.id.timestamp);
             }
    }
   ....
    public View getView(int position, View convertView, ViewGroup parent) {
            View selfieImage = convertView;
           ViewHolder holder = null;
         if(selfieImage == null) {
              LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
               selfieImage = inflater.inflate(R.layout.activity_main, parent, false);
                holder = new ViewHolder(selfieImage);
               int height = holder.selfieImage.getHeight();
               int width = holder.selfieImage.getWidth();
                selfieImage.setTag(holder);
          } 
   }

我基本上想要做的是利用Android View持有者的模式。如果convertView为null,则表示它之前没有被充气(无法重复使用),因此我们应该采取措施对其进行充气。我将膨胀的视图传递给视图的构造函数,以便能够找到其图像视图和文本视图。我的问题是在图像视图已经膨胀并附加到视图持有者之后,为什么它的高度和宽度为0?(知道这一点,因为我介入了我的代码)。这些值是实际值非常重要,因为我需要在http://developer.android.com/training/camera/photobasics.html的setPic方法中使用它们。

我查看了其他可能的问题。 https://stackoverflow.com/questions/20434257/gridview-setadapter-imageview-width-and-height-0人有类似的问题,但从未得到答案。 这个Why does my FrameLayout have 0 height?无法成为我的问题,因为用户界面应该已经绘制好了(没有在onCreate中调用它) 并且它不可能是Get ImageView width and height,因为我没有在ImageView的构造函数中调用高度和宽度 而不是这个Inflated ImageView to put in GalleryView isn't the right size,因为我确保指定父母。

有谁知道为什么身高和宽度都会返回0?我可以在我的xml文件中硬编码高度和宽度,但我认为这是糟糕的风格。

1 个答案:

答案 0 :(得分:0)

好吧,我现在有一台电脑为你测试。这就是我的尝试:我的getView方法的内部部分就是这样,它可以成功记录imageview的宽度和高度。这只是试图实现你想要实现的目标:在getView方法中获取imageview的宽度和高度。我不知道这是不是一个好习惯。因此,请自行承担风险。不过,我建议您在xml中定义大小。这取决于您的要求。

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View selfieImage = convertView;
            final ViewHolder holder;
            if (selfieImage == null) {
                LayoutInflater inflater = (LayoutInflater) parent
                        .getContext().getSystemService(
                                Context.LAYOUT_INFLATER_SERVICE);
                selfieImage = inflater.inflate(R.layout.widget_sample_item,
                        parent, false);
                holder = new ViewHolder(selfieImage);

                selfieImage.setTag(holder);

            } else {
                holder = (ViewHolder) selfieImage.getTag();
            }

            holder.timestamp.setText("this is: " + position + "th child");

            selfieImage.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED);

            int height = holder.selfieImage.getMeasuredHeight();
            int width = holder.selfieImage.getMeasuredWidth();
            Log.d("image-info", width + " | " + height);

            return selfieImage;
        }