【发布时间】:2017-03-26 07:48:02
【问题描述】:
作为练习,我正在编写一种 tictactoe Android 应用程序,它显示 9 个“下方”按钮,其中包含 9 个随机数。用户必须单击按钮并找到对。 当我正在调整我在网上找到的 tictactoe 示例时,我有一个 MainActivity 以这种方式调用 ImageButtonAdapter:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//Shows the About Game screen
public void showAboutGame(View v)
{
setContentView(R.layout.about_game);
}
public void showGame(View v)
{
setContentView(R.layout.gameplay);
GridView gv = (GridView)findViewById(R.id.gridView);
ImageButtonAdapter iba = new ImageButtonAdapter(this);
gv.setAdapter(iba);
}
ImageButtonAdapter 为每个按钮设置一个 onClickListener
for(int i=0;i<buttons.length;i++){
if(buttons[i]==null) buttons[i] = new ImageButton(c);
buttons[i].setOnClickListener(new ButtonOnClickListener(c, buttonValueSet.get(i), i, this));
}
ButtonOnClickListener 将值图像设置为单击的按钮,我尝试发送对 ImageButtonAdapter (this) 的引用,以便在适配器上使用 checkHit() 方法:
public class ButtonOnClickListener implements View.OnClickListener {
int value;
int index;
ImageButtonAdapter adapter;
int foundPairs;
int previousValue;
boolean firstClick = true;
int firstNumber;
private Context context;
//Constructor
public ButtonOnClickListener(int value, int index, ImageButtonAdapter adapter) {
this.value = value;
this.index = index;
this.adapter = adapter;
}
@Override
public void onClick(View v) {
ImageButton btn = (ImageButton) v;
switch (value) {
case 1:
btn.setBackgroundResource(R.drawable.n_1);
break;
case 2:
btn.setBackgroundResource(R.drawable.n_2);
break;
case 3:
btn.setBackgroundResource(R.drawable.n_3);
break;
case 4:
btn.setBackgroundResource(R.drawable.n_4);
break;
case 5:
btn.setBackgroundResource(R.drawable.n_5);
break;
case 6:
btn.setBackgroundResource(R.drawable.n_6);
break;
case 7:
btn.setBackgroundResource(R.drawable.n_7);
break;
case 8:
btn.setBackgroundResource(R.drawable.n_8);
break;
case 9:
btn.setBackgroundResource(R.drawable.n_9);
break;
default:
btn.setBackgroundResource(R.drawable.n_0);
}
adapter.checkHit(value);
}
}
这是一个简单的 checkHit():
public void checkHit(int value){
if(firstHit == true){
previousValue = value;
firstHit = false;
} else if(value == previousValue){
Toast.makeText(c, "You hit a pair!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(c, "This is not a pair!", Toast.LENGTH_SHORT).show();
}
}
所有这些都有效。 我的问题是,在我检查用户是否找到一对数字之后,我需要“关闭”所有与开始图像不成对的按钮。为此,我尝试以这种方式更改 checkHit():
public void checkHit(int value){
if(firstHit == true){
previousValue = value;
firstHit = false;
} else if(value == previousValue){
Toast.makeText(c, "You hit a pair!", Toast.LENGTH_SHORT).show();
closeAllAvailableButtons();
} else {
Toast.makeText(c, "This is not a pair!", Toast.LENGTH_SHORT).show();
closeAllAvailableButtons();
}
}
这不起作用。这是因为声明
btn.setBackgroundResource(R.drawable.n_1);
仅在执行了adapter.checkHit(value) 之后才执行侦听器的开头。简而言之,程序在单击和分配与按钮值对应的图像之间刷新按钮。 结果是单击,带有单击的声音,但按钮图像不变。 我认为我的问题是,在单击按钮后,我不清楚如何回到游戏的流程中。 我认为我可以使用一个意图,但 ImageButtonAdapter 不是一个活动,因此据我所知,它不能被一个意图调用。 谁能帮我? 提前感谢您的耐心等待。
【问题讨论】:
标签: android adapter onclicklistener