How to display ImageView in user view in Android

I have an action that invokes a custom view when a button is clicked. The custom view works fine until I try to add an ImageView to it. I tried this in my xml, which is called in my main action using setContentView:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.mypackage.mycustomview android:id="@+id/fbv" android:layout_width="wrap_content" android:layout_height="wrap_content" > <ImageView android:id="@+id/pistolView" android:src="@drawable/pistol" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </com.mypackage.mycustomview> 

I get a ClassCastException when I click on a button in my main activity that triggers this custom view. All I want to do is make a clickable image inside my user view.

ImageView displays and clicks fine if I put it in my main activity and main.xml as follows:

 <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Play Vs CPU" /> <ImageView android:id="@+id/pistolView" android:src="@drawable/pistol" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

I'm really bad at xml layouts in android, so I have no idea what I'm missing here. Any help is appreciated.

here is the mycustomview class:

  package com.mypackage; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.text.format.Time; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class mycustomview extends View{ final Paint mPaint = new Paint(); private Context mContext; private Resources res = getResources(); private GameControls _controls; private GameJoystick _joystick; private GameJoystick Rjoystick; Paint paint = new Paint(); private long currTime; private Time time = new Time(); private Hero mHero; private Gun mGun; private Bitmap heroBit; private float possibleX; private float possibleY; private float lazerX; private float lazerY; public ArrayList<Wall> wallList = new ArrayList<Wall>(); private Canvas mCanvas; private Bitmap splat; private Bitmap pistolBit; private Bitmap building; private ImageView pistol; private int i = 0; private int w = 0; Wall wall; private RefreshHandler mRedrawHandler = new RefreshHandler(); class RefreshHandler extends Handler { @Override public void handleMessage(Message msg) { //Log.d("3", "here3"); FanBoyView.this.update(); FanBoyView.this.invalidate(); } public void sleep(long delayMillis) { this.removeMessages(0); sendMessageDelayed(obtainMessage(0), delayMillis); } }; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //Log.d("-------------------->code", Integer.toString(keyCode)); if (keyCode == KeyEvent.KEYCODE_FOCUS) { //Log.d("-------------------->cam", "pressed"); fireGun(); return true; } return false; } public mycustomview(Context context, AttributeSet a) { super(context, a); mContext = context; time.setToNow(); currTime = time.toMillis(false); this.setFocusable(true); this.setFocusableInTouchMode(true); this.requestFocus(); final Paint paint = mPaint; paint.setColor(0xffffffff); paint.setAntiAlias(true); paint.setStrokeWidth(1); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStyle(Paint.Style.STROKE); setFocusable(true); _joystick = new GameJoystick(mContext.getResources()); Rjoystick = new GameJoystick(mContext.getResources()); _controls = new GameControls(); setOnTouchListener(_controls); Drawable bg = res.getDrawable(R.drawable.street); this.setBackgroundDrawable(bg); setWalls(); } @Override protected void onFinishInflate(){ //ImageView img = (ImageView) findViewById(R.id.pistolView); /*img.setOnClickListener(new OnClickListener() { public void onClick(View v) { Log.d("pistol","clicked"); } });*/ } ... 
+4
source share
2 answers

You get a ClassCastException because the view cannot have child views, adding child views for view groups http://developer.android.com/reference/android/view/ViewGroup.html

ImageView and TextView are normal views, and LinearLayout and ListView are view groups. Therefore, it makes sense that the latter can have children's views, and the former can not.

You can simply expand the ViewGroup instead of the View and make the necessary adjustments, but it sounds to me as if you should use a relative layout, put your own view at the bottom, as well as the image at the top.

0
source

First, when Li Zhou said that you need to make your class extended from a view group, for example, relative layout, linear layout.

 public class CustomView extends RelativeLayout { Context context; private ImageView imgView; private TextView lblView; LayoutInflater inflater; /*Do I need all three constructors for an Android custom view?*/ //if you add your View from xml and also spcify the android:style attribute like : <com.mypack.MyView style="@styles/MyCustomStyle" /> //you will also need the first constructor public MyView(Context context, AttributeSet attrs,int defStyle) public CustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; init(); } //you will need the constructor public MyView(Context context, AttributeSet attrs), otherwise you will get an Exception when Android tries to inflate your View. public CustomView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; init(); } //The third constructor is usually used when you extend a style and customize it, and then you would like to set that style to a given View in your layouts public CustomView(Context context) { super(context); this.context = context; init(); } public void init() { LayoutInflater.from(context).inflate(R.layout.widget_customview_main, this); lblView =(TextView) findViewById(R.id.lblView); imgView = (ImageView) findViewById(R.id.imgView); } 

here is the xml R.layout.widget_customview_main

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" class = "com.ikolmobile.satso." android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/lblView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="60dp" android:text="My Custom View" /> <ImageView android:id="@+id/imgView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="31dp" android:src="@drawable/abc_ab_bottom_solid_dark_holo" /> </RelativeLayout> 
0
source

All Articles