开发者

How to display an ImageView in a custom view in Android

I have an activity that calls a custom view when a button is pressed. The custom view runs fine until I try to add an ImageView to it. I have tried this in my xml that is called in my main activity with 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 the button in my main activity which initiates this custom view. All I want to do is make a clickable image inside of my custom view.

The ImageView displays fine and clicks if I put it in my main activity and main.xml like this:

<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 really am not good with the xml layouts in android, so I have no idea what I'm missing here. Any help is greatly 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 RefreshHa开发者_开发知识库ndler 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");
                        }
                    });*/
            }
...


First as Lee Chou said you need to make your class extend from view group like 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>


You're getting a ClassCastException because a View cannot have child Views, adding child views are for ViewGroups http://developer.android.com/reference/android/view/ViewGroup.html

ImageView and TextView are normal views, while LinearLayout and ListView are view groups. So it makes sense that the latter can have child views, while the former cannot.

You can just extend ViewGroup instead of View and make the necessary adjustments, but it sounds to me like you should use a relative layout, put your custom view on the bottom, and the imageview on top of that.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜