让我开始新的Android我。
我有一个GridView设置作为网格,我用它代表我正在制作的一个小板游戏应用程序的板。我为我的GridView设置了一个“setOnItemClickListener”,至少对于Toast而言,并设置了我放在那里进行测试的ImageResource。
我不知道如何从ClickListener中的其他类调用我的方法来控制触摸发生时会发生什么。似乎没有名称或任何东西可以与其他方法一起使用。 当我尝试将我的代码放入setOnItemClickListener时,但是我收到一条警告,说我的对象,我要调用方法的类,必须是最终用于另一个方法的内部类。
我无法将我的对象更改为final,所以我需要一种方法来运行一个小游戏循环,它将通过与setOnItemClickListener进行通信来调用其他类中的对象的所有方法。
以下是我的代码中包含Listener的部分:
public View play(GridView gv) {
boolean p1turn = true;
while (gameOver == false) {
gv.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View v, int position, long id){
Toast.makeText(ctxt, "" + position, Toast.LENGTH_SHORT).show();
ImageView img = (ImageView)v;
img.setImageResource(R.drawable.paper1select);
}
});
System.out.println("Why no get here??");
return(gv);//IDK why but this is NEVER reached, almost like the oICL is an infinite loop???
}
return gv;
}
侦听器内的Toast和两个ImageView img行仅用于测试它是否可行并且它是否适用于那些任务。 我需要一种方法在我的代码的其他地方使用Listener。
例如,在第一次触摸时,我想调用我创建的方法,该方法将确定所选项目是否是合格的移动单位,如果是,则将该图像与新图像交换。所以它看起来像我想象的那样 - gv.onTouchEvent1.checkPiece(player1,position); - checkPiece将从ClickListener获取位置并执行其功能。
任何setOnItemClickListener教程建议都会很好。
----------------用我的解决方案编辑--------------------------- -----
我能够使其工作的唯一方法是使用onItemClick...
内部的计数器,这将允许我控制调用哪个方法,具体取决于使用if
语句和一个循环。这仍然是一项正在进行中的工作,因此我将在稍后删除一些垃圾,但这基本上显示了我需要的内容:
public class MainActivity extends Activity {
/*
* count used to keep track of which step of game-play we are on. pNum used
* to track which player's turn it is.
*/
protected static int count = 0, pNum = 0, round = 0;
// Used to keep know that a step is done, in conjunction with count,
// redundant I believe. TRUE indicates "done".
protected static boolean choosePiece = false, chooseEmpty = false,
verifyEmpty = false, selectEnemy = false, verifyEnemy = false;
// Used to track selected piece location.
protected static int selectedLocation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageAdapter iA = new ImageAdapter(this);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(iA);
final GameplayController gc = new GameplayController(this);
// Create board model, add units to player's list.
final UnitArray gameBoardModel = new UnitArray();
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
while (count <= 6) {
System.out.println("While loop cycle: " + round);
/*
* First IF is for selecting piece to move.
*/
if (count == 0) {
System.out.println("IF 0 WAS HIT");
System.out.println("It is player " + pNum
+ "s turn, round " + round);
choosePiece = gc.choosePiece(position, gameBoardModel,
(ImageView) v, pNum);
if (choosePiece == true) {
count++;
}
selectedLocation = position;
break;
}
/*
* Second IF is for selecting blank space to move to.
*/
if (count == 1 && choosePiece == true
&& chooseEmpty == false) {
System.out.println("IF 1 WAS HIT");
chooseEmpty = gc.chooseEmpty(position, gameBoardModel,
(ImageView) v);
if (chooseEmpty == true) {
count++;
}
break;
}
/*
* Third IF is for verifying the blank selected and moving
* piece.
*/
if (count == 2 && verifyEmpty == false
&& choosePiece == true && chooseEmpty == true) {
System.out.println("IF 2 WAS HIT");
verifyEmpty = gc.checkEmptyChoice(position);
if (verifyEmpty == true) {
gc.moveToEmpty(position, gameBoardModel,
(ImageView) v, selectedLocation);
count++;
iA.notifyDataSetChanged();
selectedLocation = position;
}
break;
}
/*
* Fourth IF is for selecting an enemy unit to attack.
*/
if (count == 3 && selectEnemy == false
&& verifyEmpty == true && choosePiece == true
&& chooseEmpty == true) {
System.out.println("IF 3 WAS HIT");
selectEnemy = gc.selectEnemy(position, gameBoardModel,
(ImageView) v);
if (selectEnemy == true) {
count++;
}
break;
}
/*
* Fifth IF is for verifying enemy unit to attack and then
* attacking.
*/
if (count == 4 && verifyEnemy == false
&& selectEnemy == true && verifyEmpty == true
&& choosePiece == true && chooseEmpty == true) {
System.out.println("IF 4 WAS HIT");
verifyEnemy = gc.verifyEnemySelected(position);
if (verifyEnemy) {
/*
* For clarity, position is enemy being attacked,
* selectedLocation is position of attacking unit.
*/
gc.attackEnemy(position, gameBoardModel,
(ImageView) v, selectedLocation);
// RESET FOR NEXT PLAYER TURN.
iA.notifyDataSetChanged();
if (pNum == 0) {
pNum = 1;
} else {
pNum = 0;
}
iA.notifyDataSetChanged();
count = 0;
choosePiece = false;
chooseEmpty = false;
verifyEmpty = false;
selectEnemy = false;
verifyEnemy = false;
round++;
}
break;
}
}
}
});
}
...
在onItemClick
中有如此多的代码,我觉得很奇怪。我的初衷是调用一种方法,该方法几乎包含了我最终放入onClick的所有内容,因为我无法弄清楚如何区分其位置上的触摸事件。
答案 0 :(得分:2)
我不会称自己为新人
... Ummmm
当我尝试将我的代码放在setOnItemClickListener中时,但是我收到一条警告,说我的对象,我要调用方法的类,必须是最终在另一个方法的内部类中使用。
这是因为有问题的对象是setOnItemClickListener()
的参数或是局部变量,而不是play()
方法所在的类的数据成员。
请记住OnItemClickListener
是一个接口,因此您不需要像现在这样使用匿名内部类。例如,您可以在Activity
上实现此接口(可能)正在托管play()
方法。
匿名内部类是一种强大但专家的Java技术。我教过许多Android课程,有很多经验丰富的Java开发人员不认识,更不用说使用匿名内部课程了。鉴于您的相对经验水平,我建议您尽可能避免使用它们。
以下是我的代码中包含Listener
的部分
您正在循环中调用setOnItemClickListener()
。这可能不是你想要的。
我需要一种方法在我的代码的其他地方使用Listener。
不,你没有。您可能需要让侦听器从其onItemClick()
方法执行其他操作,但作为对象的侦听器本身只会在这一个地方使用,除非某些严重奇怪编码
所以看起来像我想象的那样 - gv.onTouchEvent1.checkPiece(player1,position); -
或者在checkPiece()
上实现Activity
(可能)托管所有这些代码,在这种情况下,您只需要调用它。
我已经学习Java一年了,我的第一语言
要完全生硬,你的问题与Android无关,而与Java有关。请随意在StackOverflow上询问java语法和相关问题,但是如果它可能与Java更相关,那么请使用java标记(可能除android标记之外)。 Android的类和方法。