2011-05-26 99 views
3

我一直在讨论Snake示例代码,我试图为了培训而对此进行修改,希望能够增加对Android工作方式的理解。android - setOnClickListener;

到目前为止,我已经添加了两个按钮+相应的setOnClickListener代码,如下所示。

snake_layout.xml

  <Button 
     android:layout_height="39px" 
     android:layout_width="55px" 
     android:layout_marginLeft="15px" 
     android:text="Left" 
     android:id="@+id/left_button" /> 

     <Button 
     android:layout_height="39px" 
     android:layout_width="55px" 
     android:layout_marginLeft="240px" 
     android:text="Right" 
     android:id="@+id/right_button" /> 

Snake.java

. 
. 
. 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // No Title bar 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    setContentView(R.layout.snake_layout); 

    final Button leftButton = (Button) findViewById(R.id.left_button); 
    leftButton.setOnClickListener(new Button.OnClickListener() { 
     public void onClick(View v) 
      { 
       //perform action 
      } 
     }); 

    final Button rightButton = (Button) findViewById(R.id.right_button); 
    rightButton.setOnClickListener(new Button.OnClickListener() { 
     public void onClick(View v) 
      { 
       //perform action 
      } 
     }); 
. 
. 
. 

两个按钮出现在那里,当我尝试一个简单的方法,他们应该和工作,这样的为“finish()”。

现在,我想这样做是让这些按钮触发下面的代码, 在SnakeView.java

 if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { 
     if (mDirection != EAST) { 
      mNextDirection = WEST; 
     } 
     return (true); 
    } 

    if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { 
     if (mDirection != WEST) { 
      mNextDirection = EAST; 
     } 
     return (true); 
    } 

要清楚,我需要我的屏幕上的定制按钮执行与当前代码中的“KEYCODE_DPAD_RIGHT”和“KEYCODE_DPAD_LEFT”相同的作业。 我的Xperia X10i没有配备DPAD,这是它的一部分;-P

我真的很感谢在正确方向上的一些指针。正如你可能已经猜到我是相当新的这个..

在此先感谢球员

+0

我没有看到一个问题或一个问题。你有什么需要帮助的? – 2011-05-26 14:10:58

回答

1

入住这里:

Throwing/Simulating KeyStrokes programatically

的基本逻辑背后隐藏:

private void doInjectKeyEvent(KeyEvent kEvent) { 
    try { 
     /* Inject the KeyEvent to the Window-Manager. */ 
     windowManager.injectKeyEvent(kEvent.isDown(), kEvent.getKeyCode(), 
      kEvent.getRepeatCount(), kEvent.getDownTime(), 
      kEvent.getEventTime(), true); 
    } catch (DeadObjectException e) { 
     e.printStackTrace(); 
    } 
} 
1

代替onClick方法中的// perform action,从现有代码中复制相应的主体(例如,if (mDirection != EAST) mNextDirection = WEST;)。

另外,以像素为单位指定按钮尺寸被认为是不好的做法。对于要在可能具有非常不同的像素密度和屏幕尺寸的设备上运行的代码,这并不适用。让按钮根据它们所包含的内容来调整自己的尺寸会更好。

0

您需要在SnakeView.java中创建一个允许您更改mNextDirection的函数。

public void setMNextDirection(int direction){ 
    //check if the direction is recognised 
    if (direction == EAST || direction == WEST) { 
    mNextDirection = direction; 
    } 

后,您可以使用:

mSnakeView.setMNextDirection(mSnakeView.WEST);