我写了一个自定义的view,里面用handler做了一个循环,在循环的过程中,我点击左右键怎么没有反应呢?
我想要的结果是:循环打印 begin 和 handler, 当按下左右键是打印:Left 和 Right
请同学们指出原因,给出解决办法?
下面是我的代码:
TestHandler 是一个activitpackage cn.com.android;import android.app.Activity;
import android.os.Bundle;public class TestHandler extends Activity {
private ManTest test;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        test = (ManTest) findViewById(R.id.manTest);
        test.begin();
    }
}这个是自定义Viewpackage cn.com.android;import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;public class ManTest extends View{
public ManTest(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ManTest(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode ==KeyEvent.KEYCODE_DPAD_LEFT){
System.out.println("KEY------>   Left");
}
if(keyCode ==KeyEvent.KEYCODE_DPAD_RIGHT){
System.out.println("KEY------>   Right");
}
return super.onKeyDown(keyCode, event);
}
private RefreshHandler handler = new RefreshHandler();
class RefreshHandler extends Handler {        @Override
        public void handleMessage(Message msg) {
         System.out.println("Handler");
            begin();
            ManTest.this.invalidate();
        }        public void sleep(long delayMillis) {
         this.removeMessages(0);
            sendMessageDelayed(obtainMessage(0), delayMillis);
        }
    };
public void begin(){
System.out.println("Begin");
handler.sleep(1000);
}}main.xml<?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"
    >
<cn.com.android.ManTest android:id="@+id/manTest" 
android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
/>
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>

解决方案 »

  1.   

    KEYCODE_DPAD_LEFT
    KEYCODE_DPAD_RIGHT
    这两个是物理键盘的左右键,你点鼠标当然没用,android里没有鼠标。
    鼠标左键按下相当于touchdown,抬起相当于touchup
      

  2.   

    up
    楼主可以在onKeyDown里debug跟踪一下点击鼠标的时候是否能进入此函数,如果能进入就可以当场key来响应,那样再查查是发的哪个key消息。
      

  3.   

     System.out.println好像就是没反应~
      

  4.   

    用Log.i, Log.v, Log.w等在logcat里查看
     
    android logcat用法总结
    http://blog.csdn.net/czbever/archive/2010/09/27/5910640.aspx
      

  5.   

     System.out.println("KEY------>   Left");
    你如果先显示在界面上应该用textview.settext("KEY------>   Left");
     System.out.println
    这样打印出来的在logcat里面
      

  6.   

    sample的贪吃蛇游戏也是用的onkeydown,这就可以在模拟器上响应。如果是‘鼠标左键按下相当于touchdown,抬起相当于touchup’,我我怎么区别点击模拟器上的左右键呀??谢谢啊
      

  7.   

    onkeydonw 没有进入
    不过现在有一个解决办法了,@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    test.onKeyDown(keyCode, event);
    return super.onKeyDown(keyCode, event);
    }  
    在activity中重写该方法,不过感觉不应该这样解决,为什么要这样调用呢?请高手明示!!贪吃蛇游戏里面是没有在activity中重写onkyedown的
      

  8.   

    我没说明白?
    KEYCODE_DPAD_LEFT
    KEYCODE_DPAD_RIGHT
    就是模拟器上的左右键
      

  9.   

    你按模拟器上按键,就会进入到onkeydown函数里了。
    当然,前提是你建立模拟器时是有添加dpad的支持才行。
      

  10.   

    我的模拟器上可以跑贪吃蛇游戏,说明已经有dpad支持了吧
    我现在如果不在activity中显示调用view里面的onkeydown,就不能进入view 里面的onkeydown方法
    贪吃蛇游戏就没有显示调用,能帮我看下是什么原因吗
      

  11.   

    是怎么解决的啊!说说原理啊!我也碰到了这个问题!
    我用的是KEmulator模拟器!
      

  12.   

    在axtivity里面将view.setFocusable(true);
      

  13.   

    应该在创建模拟器的时候加入DPAD支持