我有一个自定义视图,它只是一个图像,当点按时,会显示一些文字作为叠加层。
我不认为我正确地将其充气,因为当我这样做时:
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;
}
答案 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;
}