我正确地为自定义视图充气吗?

时间:2014-07-31 07:30:43

标签: java android

我有一个自定义视图,它只是一个图像,当点按时,会显示一些文字作为叠加层。

我不认为我正确地将其充气,因为当我这样做时:

ImageTapView imageTapView = new ImageTapView(context);
ImageView imageView = (ImageView) imageTapView.findViewById(R.id.image);

此处,imageView即使在我的layout.xml文件中定义,也会返回null。

这是我的自定义课程:

public class ImageTapView extends View {
    public ImageTapView(Context context){
        super(context);
        init(context);
    }
    public ImageTapView(Context context, AttributeSet attrs){
        super(context, attrs);
        init(context);
    }
    private void init(Context context){
        inflate(context, R.layout.image_tap_view, null);
    }
}

这是image_tap_view.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/image"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="Test Image~"/>
        </RelativeLayout>
</LinearLayout>

最后在我的列表视图适配器中,我在这里创建它:

public View getView(int position, View convertView, ViewGroup parent){
       ImageTapView imageTapView = new ImageTapView(context);
       ImageView imageView = (ImageView) imageTapView.findViewById(R.id.image);

       //ERROR GETS THROWN HERE: imageView = null

       try {
           String url = "http://www.example.com/lionshop/" + images.get(position);
           DownloadPicasso(url, imageView);
       } catch (Exception e){
           Log.d("LoadImage", e.getLocalizedMessage());
       }

       imageView.setAdjustViewBounds(true);
       imageView.setScaleType(ImageView.ScaleType.FIT_XY);
       return imageTapView;
 }

4 个答案:

答案 0 :(得分:1)

将此作为ViewGroup方法inflate

中的第三个参数inflate(context, R.layout.image_tap_view, this);传递

答案 1 :(得分:1)

  private void init(Context context){
        inflate(context, R.layout.image_tap_view, null);
  }

这是View的辅助方法。它的实现是

public static View inflate(Context context, int resource, ViewGroup root) {
        LayoutInflater factory = LayoutInflater.from(context);
        return factory.inflate(resource, root);
}

所以,以root身份提供null将使其返回膨胀的视图。您应该通过addView将其添加到View的层次结构中,该层次结构不仅适用于ViewGroup。回到你的问题,你使用它的方式是中立

答案 2 :(得分:1)

你必须这样做在你的适配器getView()中,第一个语句应该是

LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 if(convertView==null){
  convertView = inflater.inflate(
                    R.layout.image_tap_view, parent, false);}

答案 3 :(得分:1)

首先,删除ImageTapView类。这是多余的。无论如何,你是对的:视图没有正确膨胀。相反,这样做:

public View getView(int position, View convertView, ViewGroup parent) {
   if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.image_tap_view, parent, false);
   }
   ImageView imageView = (ImageView) convertView.findViewById(R.id.image);

   try {
       String url = "http://www.example.com/lionshop/" + images.get(position);
       DownloadPicasso(url, imageView);
   } catch (Exception e){
       Log.d("LoadImage", e.getLocalizedMessage());
   }

   imageView.setAdjustViewBounds(true);
   imageView.setScaleType(ImageView.ScaleType.FIT_XY);
   return convertView;
}