Android 安卓:按钮';s onClick方法不是线性处理的?

Android 安卓:按钮';s onClick方法不是线性处理的?,android,button,onclick,Android,Button,Onclick,我正在学习Android应用程序编码,并认为编写Tictatcoe是个好主意。所以我在一个活动中让六个按钮线性排列,当点击时它们的颜色会改变,这取决于玩家的回合(橙色或蓝色)。onClickListener的onClick方法如下所示: public void onClick(View v) { if(player == 1) { ((Button)v).setBackgroundColor(getResources().getColor(android.R.c

我正在学习Android应用程序编码,并认为编写Tictatcoe是个好主意。所以我在一个活动中让六个按钮线性排列,当点击时它们的颜色会改变,这取决于玩家的回合(橙色或蓝色)。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.postdayed之类的东西,因为似乎整个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;
    }
}
重置板方法:

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

是的,我想它发生得很快,这就是为什么你没有看到它。您有一些方法:

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

2-显示一个AlertDialog说“玩家X赢了!”,当用户按OK时,重置棋盘。大概是

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()可以是


是的,我想它发生得很快,这就是为什么你没有看到它。您有一些方法:

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

2-显示一个AlertDialog说“玩家X赢了!”,当用户按OK时,重置棋盘。大概是

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()可以是


我可能需要补充的是,我还尝试将文本写入单击的每个按钮。在这种情况下,当显示消息“Player x won”时,最后一个按钮显示文本,随后刷新游戏场。所以我不认为刷新PlayField只是为了让我注意到相应按钮颜色的变化。你也可以发布playerWins方法吗?如果立即刷新,则可能看不到颜色变化。它不会被“眼睛察觉”,因为它改变的速度。希列宁,我刚刚更新了我的帖子。嗨@业余爱好者,你把
postDelayed
放在哪里了?列宁是正确的。在重置电路板之前,代码中没有任何内容会阻止或暂停执行,并且背景设置为默认颜色。它是“线性”运行的,但它发生得太快了。我可能需要补充一点,我也尝试过在每个单击的按钮上写入文本。在这种情况下,当显示消息“Player x won”时,最后一个按钮显示文本,随后刷新游戏场。所以我不认为刷新PlayField只是为了让我注意到相应按钮颜色的变化。你也可以发布playerWins方法吗?如果立即刷新,则可能看不到颜色变化。它不会被“眼睛察觉”,因为它改变的速度。希列宁,我刚刚更新了我的帖子。嗨@业余爱好者,你把
postDelayed
放在哪里了?列宁是正确的。在重置电路板之前,代码中没有任何内容会阻止或暂停执行,并且背景设置为默认颜色。它是“线性”运行的,但它发生得太快了。这是一个很好的方法,对我来说效果很好。谢谢你的努力!很好的方法,对我很有效。谢谢你的努力!