说明
我创建了View,其中我使用canvas绘制了矩形,并在该视图中实现了On Touch Event。
我希望通过这种方式启动新活动。
问题:
现在的问题是,每当我触摸该矩形时,“强制关闭”错误就会弹出。
这是PickCardView.java
public class PickCardView extends View
{
private Paint mCanvasPaint;
private Rect mScreenSize = new Rect();
private Rect mCardSize = new Rect();
private int mCardCap;
private Card MCards;
public PickCardView(Context context)
{
super(context);
mCanvasPaint = new Paint();
mCanvasPaint.setColor(0xFF228B22); // Green background
mCanvasPaint.setAntiAlias(false);
mCanvasPaint.setFilterBitmap(false);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
// Store current screen size
mScreenSize.set(0, 0, w, h);
// Calculate card and decks sizes and positions
int cw = w / 11;
mCardSize.set(0, 0, cw, (int) (cw * 1.5));
Log.v("card size", mCardSize.toString());
int freeSize = w - cw * 7; //117
mCardCap = freeSize / (6 + 4 * 2);//5
int cy = (int) (mScreenSize.height() * 0.35);
//MIDDLE CARD HOLDER
MCards = new Card(Card.CardType.PickDeck, mCardCap * 2 + mCardSize.width()*4 - 15, cy - 20, mCardSize.width()+60, mCardSize.height()+60);
}
@Override
public void onDraw(Canvas canvas)
{
mCanvasPaint.setStyle(Style.FILL);
canvas.drawRect(mScreenSize, mCanvasPaint);
MCards.doDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN)
{
int x = (int) event.getX();
int y = (int) event.getY();
Card card = getCardUnderTouch(x, y);
if(card != null)
{
Intent i = new Intent(null, BuildWord.class);
startActivity(i);
}
}
return true;
}
private void startActivity(Intent i)
{
//Intent i1 = new Intent(null, BuildWord.class);
}
private Card getCardUnderTouch(int x, int y)
{
Card ret = null;
if (MCards.isUnderTouch(x, y))
{
return MCards;
}
return ret;
}
}
当触摸该矩形时,这是logcat中显示的错误:
11-13 21:07:12.037: E/InputEventReceiver(712): Exception dispatching input event.
11-13 21:07:12.037: E/MessageQueue-JNI(712): Exception in MessageQueue callback: handleReceiveCallback
11-13 21:07:12.138: E/MessageQueue-JNI(712): java.lang.NullPointerException
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.content.ComponentName.<init>(ComponentName.java:75)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.content.Intent.<init>(Intent.java:3301)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at apk.gameshufflewords.PickCardView.onTouchEvent(PickCardView.java:79)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.View.dispatchTouchEvent(View.java:7127)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.app.Activity.dispatchTouchEvent(Activity.java:2396)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.View.dispatchPointerEvent(View.java:7307)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3174)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3119)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4155)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4134)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4226)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.os.MessageQueue.nativePollOnce(Native Method)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.os.MessageQueue.next(MessageQueue.java:125)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.os.Looper.loop(Looper.java:124)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.app.ActivityThread.main(ActivityThread.java:4745)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at java.lang.reflect.Method.invokeNative(Native Method)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at java.lang.reflect.Method.invoke(Method.java:511)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-13 21:07:12.138: E/MessageQueue-JNI(712): at dalvik.system.NativeStart.main(Native Method)
11-13 21:07:12.167: D/AndroidRuntime(712): Shutting down VM
11-13 21:07:12.167: W/dalvikvm(712): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
11-13 21:07:12.267: E/AndroidRuntime(712): FATAL EXCEPTION: main
11-13 21:07:12.267: E/AndroidRuntime(712): java.lang.NullPointerException
11-13 21:07:12.267: E/AndroidRuntime(712): at android.content.ComponentName.<init>(ComponentName.java:75)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.content.Intent.<init>(Intent.java:3301)
11-13 21:07:12.267: E/AndroidRuntime(712): at apk.gameshufflewords.PickCardView.onTouchEvent(PickCardView.java:79)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.View.dispatchTouchEvent(View.java:7127)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877)
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925)
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.app.Activity.dispatchTouchEvent(Activity.java:2396)
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.View.dispatchPointerEvent(View.java:7307)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3174)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3119)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4155)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4134)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4226)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.os.MessageQueue.nativePollOnce(Native Method)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.os.MessageQueue.next(MessageQueue.java:125)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.os.Looper.loop(Looper.java:124)
11-13 21:07:12.267: E/AndroidRuntime(712): at android.app.ActivityThread.main(ActivityThread.java:4745)
11-13 21:07:12.267: E/AndroidRuntime(712): at java.lang.reflect.Method.invokeNative(Native Method)
11-13 21:07:12.267: E/AndroidRuntime(712): at java.lang.reflect.Method.invoke(Method.java:511)
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-13 21:07:12.267: E/AndroidRuntime(712): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:1)
将onTouchEvent更改为
@Override
public boolean onTouchEvent(MotionEvent event)
{
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN)
{
int x = (int) event.getX();
int y = (int) event.getY();
Card card = getCardUnderTouch(x, y);
if(card != null)
{
Context context = getContext();
Intent i = new Intent(context, BuildWord.class);
context.startActivity(i);
}
}
return true;
}
删除你的startActivity方法
答案 1 :(得分:0)
您正在以下行中创建一个带有Intent
上下文的新null
:
Intent i = new Intent(null, BuildWord.class);
您应该执行以下操作:
Context mContext;
public PickCardView(Context context)
{
super(context);
mContext = context;
...
}
然后通过以下方式替换意图行:
Intent i = new Intent(mContext, BuildWord.class);
问候。