android - OnTouch 监听器无法在 fragment 中工作

标签 android android-fragments ontouchlistener

我正在通过 fragment 类实现 OnTouch 监听器。

public class ButtonFragment extends Fragment implements OnTouchListener

重写的 onTouch 函数看起来像。

@Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        switch(v.getId())
        {
        case R.id.buttonUp : 
        {
            mAction = new Thread(){
                @Override
                public void run()
                {

                    try {
                        ChartJNI3D.cameraPos(1.0f, 'U');
                        mAction.wait();

                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            };
            if(event.getAction() == MotionEvent.ACTION_DOWN)
                mAction.start();
            else if (event.getAction() == MotionEvent.ACTION_UP)
                mAction.stop();
        }
        break;

等等。 问题是它只需要一个 OnClick 事件就可以调用该函数。 但是,当它遇到 MotionEvent.ACTION_UP 时,应用程序会因空指针异常而崩溃。 如果有人需要,可以发布日志。

01-08 17:59:10.771: E/AndroidRuntime(3926): FATAL EXCEPTION: Thread-344
01-08 17:59:10.771: E/AndroidRuntime(3926): java.lang.IllegalMonitorStateException: object not locked by thread before wait()
01-08 17:59:10.771: E/AndroidRuntime(3926):     at java.lang.Object.wait(Native Method)
01-08 17:59:10.771: E/AndroidRuntime(3926):     at java.lang.Object.wait(Object.java:364)
01-08 17:59:10.771: E/AndroidRuntime(3926):     at com.example.sample3dchart.ButtonFragment$1.run(ButtonFragment.java:53)
01-08 17:59:10.816: E/InputEventReceiver(3926): Exception dispatching input event.
01-08 17:59:10.816: E/MessageQueue-JNI(3926): Exception in MessageQueue callback: handleReceiveCallback
01-08 17:59:10.821: E/MessageQueue-JNI(3926): java.lang.UnsupportedOperationException
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at java.lang.Thread.stop(Thread.java:1076)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at java.lang.Thread.stop(Thread.java:1063)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at com.example.sample3dchart.ButtonFragment.onTouch(ButtonFragment.java:64)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.View.dispatchTouchEvent(View.java:7241)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.app.Activity.dispatchTouchEvent(Activity.java:2410)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.View.dispatchPointerEvent(View.java:7426)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.os.MessageQueue.nativePollOnce(Native Method)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.os.MessageQueue.next(MessageQueue.java:125)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.os.Looper.loop(Looper.java:124)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at android.app.ActivityThread.main(ActivityThread.java:5041)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at java.lang.reflect.Method.invokeNative(Native Method)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at java.lang.reflect.Method.invoke(Method.java:511)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-08 17:59:10.821: E/MessageQueue-JNI(3926):   at dalvik.system.NativeStart.main(Native Method)

什么时候代替

try {
                            ChartJNI3D.cameraPos(1.0f, 'U');
                            mAction.wait();

                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

我愿意

try {
                            ChartJNI3D.cameraPos(1.0f, 'U');
                            mAction.sleep(100);

                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

日志是

01-08 18:01:28.371: E/AndroidRuntime(4125): FATAL EXCEPTION: main
01-08 18:01:28.371: E/AndroidRuntime(4125): java.lang.UnsupportedOperationException
01-08 18:01:28.371: E/AndroidRuntime(4125):     at java.lang.Thread.stop(Thread.java:1076)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at java.lang.Thread.stop(Thread.java:1063)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at com.example.sample3dchart.ButtonFragment.onTouch(ButtonFragment.java:64)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.View.dispatchTouchEvent(View.java:7241)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.app.Activity.dispatchTouchEvent(Activity.java:2410)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.View.dispatchPointerEvent(View.java:7426)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.os.MessageQueue.nativePollOnce(Native Method)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.os.MessageQueue.next(MessageQueue.java:125)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.os.Looper.loop(Looper.java:124)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at java.lang.reflect.Method.invokeNative(Native Method)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at java.lang.reflect.Method.invoke(Method.java:511)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-08 18:01:28.371: E/AndroidRuntime(4125):     at dalvik.system.NativeStart.main(Native Method)

最佳答案

您崩溃的原因是您滥用了 Java Thread 对象,通过调用已弃用的 stop() 方法来结束您的 Thread。

  private MyThread mAction;
  private class MyThread extends Thread() {
    volatile boolean keepRunning = true;

    @Override
    public void run() {
      try {
        ChartJNI3D.cameraPos(1.0f, 'U');
        while(keepRunning);
      } catch (InterruptedException e) {}
    }

    public void quit() {
       keepRunning = false;
    }
  }

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    switch(v.getId()) {
        case R.id.buttonUp: {
            if(event.getAction() == MotionEvent.ACTION_DOWN)
                mAction = new MyThread();
                mAction.start();
            else if (event.getAction() == MotionEvent.ACTION_UP)
                mAction.quit();
        }
        break;
    }
  }

关于android - OnTouch 监听器无法在 fragment 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20185212/

相关文章:

java - 模拟器上的背景被拉伸(stretch)

android - Fragment 中的 TextureView 从不调用 onSurfaceTextureAvailable

android - 找不到类异常

android - 将 Fragment 放在前面(无 Fragment Recreation)

android - 如何将触摸监听器传递给自定义 View 以进行拖放?

java - 如何将多个视频文件一起写入以创建一个视频文件

java - onCreate中出现NullPointerException,调试后似乎找不到原因

android - 将 native 应用程序与 Worklight 项目相结合

java - 在 Gallery 中嵌入 ListView

android - 触摸 Android 时停止 fakedrag