Android - setOnClickListener;

3

我一直在尝试修改Snake示例代码,以便进行培训并增加对Android工作原理的理解。

到目前为止,我已经添加了两个按钮和相应的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
我真的很感激一些指向正确方向的提示。正如你可能已经猜到的,我对此还比较新。感谢大家的帮助。

我没有看到任何问题或疑问。你需要什么帮助? - nicholas.hauschild
3个回答

2

请查看这里:

以编程方式抛出/模拟按键

基本逻辑隐藏在以下代码背后:

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();
    }
}

2

在你的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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接