Android:Button的onClick方法不是线性处理的吗?

时间:2019-11-13 21:15:08

标签: android button onclick

我正在学习Android应用程序编码,并且认为对TicTacToe进行编码将是一个不错的主意。因此,我在一个活动中获得了六个线性排列的按钮,这些按钮在被点击时会改变颜色,具体取决于玩家的回合(橙色或蓝色)。 onClickListener的onClick方法如下:

public void onClick(View v)
{

    if(player == 1)
    {
        ((Button)v).setBackgroundColor(getResources().getColor(android.R.color.holo_orange_dark));

    }
    else
    {
        ((Button)v).setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));

    }

    gameControl();
}

gameControl遵循游戏基本知识:检查玩家是否获胜,是否平局等:


    public void gameControl()

     if(checkForWin())
     {
         playerWins(player);
     }
     else if(round == 9)
     {
         draw();
     }
     else
     {
         if(player == 1)
             player = 2;
         else
             player = 1;
     }

     round++;
 }

我的问题是,如果玩家获胜,即单击赢得游戏的最后一个按钮,则按钮的颜色不会改变。而是,playerWins方法(在gameControl中)在按钮颜色更改之前刷新“游戏场”。我已经尝试过诸如Handler.postDelayed之类的东西,因为似乎在解决按钮颜色之前,整个onClick方法都已运行完了,但是在那里没有成功。为什么onClick方法不能线性处理?有什么方法可以刷新活动吗?预先感谢...

感谢您的快速回复,以下是请求的方法:

private void playerWins(int player)
{
    if(player == 1)
    {
        player1Points++;
        Toast.makeText(this,"Player 1 wins!", Toast.LENGTH_SHORT).show();
        updatePointsText();
        resetBoard();
        round = 1;
    }

    if(player == 2)
    {
        player2Points++;
        Toast.makeText(this,"Player 2 wins!", Toast.LENGTH_SHORT).show();
        updatePointsText();
        resetBoard();
        round = 1;
    }
}

resetBoard方法:

private void resetBoard()
{
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            buttons[i][j].setBackgroundColor(Color.parseColor("#B0C4DE"));
        }
    }
}

1 个答案:

答案 0 :(得分:0)

是的,我猜想它正在迅速发生,这就是为什么您没有看到它。您有一些方法:

1-将刷新按钮放在某个位置,仅在单击该按钮时刷新(例如,如果用户知道这将是抽签,并且他们希望在完成之前再次开始,则此选项会很好)。因此,使用此选项,您将不会在用户看到更新之前重置。

2-显示一个AlertDialog,说“玩家X获胜!”当用户按“确定”时,将板复位。就像

AlertDialog dialog = AlertDialog.Builder(context);
dialog.setTitle("Your title");
dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int id) {
      resetBoard()
   }
 });
dialog.setCancellable(false);
dialog.show();

也请检查一下,您在重复代码时可以减少一些代码重构。例如playerWins()可能是

private void playerWins(int player){

  if(player == 1)
  {
      player1Points++;
      Toast.makeText(this,"Player 1 wins!", Toast.LENGTH_SHORT).show();
  }

  if(player == 2)
  {
    player2Points++;
    Toast.makeText(this,"Player 2 wins!", Toast.LENGTH_SHORT).show();
  }

  updatePointsText();
  resetBoard();
  round = 1;
}