Я работаю над игрой, в которой игрок может перетаскивать предметы по экрану. У меня есть частный метод, который позволяет мне имитировать событие перетаскивания для любого из элементов, которые игрок может перемещать. Для перетаскивания я фактически оставляю представление, которого они коснулись, там, где оно есть, и создаю новый ImageView с и устанавливаю возможность рисования в drawingCache из затронутого представления, а затем перемещаю этот недавно созданный ImageView по экрану, следуя за их пальцем. Когда вы отпускаете палец (опускаете представление), я вызываю myLayout.remove (movingImg);
, чтобы убрать его с экрана. У меня возникла проблема, когда, если я запускаю имитацию события перетаскивания, а затем вручную выбираю один из других элементов, я получаю нулевой указатель на вызов myLayout.remove (), вот след из журнала:
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): java.lang.NullPointerException
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2122)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.View.draw(View.java:9032)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.widget.FrameLayout.draw(FrameLayout.java:419)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1910)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewRoot.draw(ViewRoot.java:1608)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewRoot.performTraversals(ViewRoot.java:1329)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewRoot.handleMessage(ViewRoot.java:1944)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.os.Handler.dispatchMessage(Handler.java:99)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.os.Looper.loop(Looper.java:126)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.app.ActivityThread.main(ActivityThread.java:3997)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at java.lang.reflect.Method.invokeNative(Native Method)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at java.lang.reflect.Method.invoke(Method.java:491)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at dalvik.system.NativeStart.main(Native Method)
Трассировка не t указывает на что-нибудь внутри моей деятельности. Исключение генерируется всякий раз, когда он пытается вызвать myLayout.remove () в моделированном представлении перетаскивания. Я окружил эту строку попыткой / уловом, но это ничего не дало. Я знаю, что эта строка вызывает у меня проблемы, потому что, если я закомментирую ее, я не получу исключения, но, очевидно, мое представление никогда не удаляется с экрана. Я создаю это приложение на Motorola xoom, но я не уверен, что это проблема конкретного устройства или нет. Кто-нибудь знает, что здесь может происходить?
Отсюда вызывается .removeView ():
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
Log.i(myTag, "Animation End");
try {
//myLayout.removeView(simulateMovingImg); //This is the line that is throwing a null pointer
simulateMovingImg.setVisibility(View.GONE); //This is how I am currently getting around the issue
params = new LayoutParams(oneImg.getWidth(),oneImg.getHeight()); // While its moving it appears larger than normal
simulateMovingImg.setLayoutParams(params); // so I set it back to the normal size
if(whichTarget == true){
targetImg.setImageDrawable(simulateMovingImg.getDrawable()); //targetImg is one of the 'drop zones' so I set its
// drawable to make it seem like the view was 'dropped' into this zone
}else{
target1Img.setImageDrawable(simulateMovingImg.getDrawable()); // same with target1Img.
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
iAmDone = true;
}
});
Это внутри AnimationListener для анимации перевода, которая перемещает мой ImageView с того места, где он начинается, куда он падает