Android 安卓:按钮';s onClick方法不是线性处理的?
我正在学习Android应用程序编码,并认为编写Tictatcoe是个好主意。所以我在一个活动中让六个按钮线性排列,当点击时它们的颜色会改变,这取决于玩家的回合(橙色或蓝色)。onClickListener的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
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
放在哪里了?列宁是正确的。在重置电路板之前,代码中没有任何内容会阻止或暂停执行,并且背景设置为默认颜色。它是“线性”运行的,但它发生得太快了。这是一个很好的方法,对我来说效果很好。谢谢你的努力!很好的方法,对我很有效。谢谢你的努力!