vistas tipo studio linearlayout elementos ejemplo cambiar amontonados android view imageview

tipo - view android studio



Cómo mostrar un ImageView en una vista personalizada en Android (2)

Obtiene una ClassCastException porque una Vista no puede tener vistas secundarias, y las vistas secundarias son para ViewGroups http://developer.android.com/reference/android/view/ViewGroup.html

ImageView y TextView son vistas normales, mientras que LinearLayout y ListView son grupos de vista. Entonces tiene sentido que este último pueda tener vistas de niños, mientras que el primero no.

Puede ampliar ViewGroup en lugar de View y hacer los ajustes necesarios, pero me parece que debería usar un diseño relativo, poner su vista personalizada en la parte inferior y la imagen vista encima de eso.

Tengo una actividad que llama a una vista personalizada cuando se presiona un botón. La vista personalizada funciona bien hasta que intento agregarle un ImageView. He intentado esto en mi xml que se llama en mi actividad principal con 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>

Obtengo una ClassCastException cuando hago clic en el botón de mi actividad principal que inicia esta vista personalizada. Todo lo que quiero hacer es hacer una imagen clicable dentro de mi vista personalizada.

ImageView muestra bien y hace clic si lo pongo en mi actividad principal y main.xml de esta manera:

<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"/>

Realmente no soy bueno con los diseños xml en Android, así que no tengo idea de lo que me falta aquí. Cualquier ayuda es muy apreciada.

aquí está la clase mycustomview:

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"); } });*/ } ...


Primero, como dijo Lee Chou, necesitas hacer que tu clase se extienda desde el grupo de vista, como el diseño relativo, el diseño lineal.

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); }

aquí está el 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>