更改图像的二维数组 OnClick
Changing 2D array of images OnClick
我是 Android 开发(和 Java)的初学者。我在布局(二维图像数组)中有许多 ImageView
。我想要实现的是,每次当我点击 ImageView
时,它应该根据显示当前图像的某种逻辑从数组中设置图像(例如,数组中的下一张图像,每次点击) .我用谷歌搜索并设法做到了这一点,但它看起来相当长。
public class GameActivity extends AppCompatActivity {
private int [] inputTiles = {R.drawable.one, R.drawable.two, ...// more images};
Random r = new Random();
int matSize = 5;
int[][] indexMat = new int[matSize][matSize];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
for (int i=0; i<matSize; i++) {
for (int j=0; j<matSize; j++) {
indexMat[i][j] = r.nextInt(10);
}
}
final ImageView tile00 = findViewById(R.id.tile00);
tile00.setImageResource(inputTiles[indexMat[0][0]]);
tile00.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
indexMat[0][0] = (indexMat[0][0]+1)%5;
tile00.setImageResource(inputTiles[indexMat[0][0]]);
}
});
final ImageView tile01 = findViewById(R.id.tile01);
tile01.setImageResource(inputTiles[indexMat[0][1]]);
tile01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
indexMat[0][1] = (indexMat[0][1]+1)%5;
tile01.setImageResource(inputTiles[indexMat[0][1]]);
}
});
...// a lot more ImageViews
}
}
假设我正在显示 5x5 的图像网格。我有一个数组 inputTiles
和一个 5x5 数组 indexMat
中的可用图像,用于将当前图像的索引存储在 i
、j
位置。然后,对于每个 ImageView
我正在监听点击并从数组中选择另一个图像来显示。这工作得很好,但在这个特定的例子中,我必须写 "clicklisten and action" 块 25 次。如果有一种方法可以循环它,这样我就可以拥有任何 n x n
网格,那就太好了。
我在谷歌搜索了一下后尝试循环,方法是将 ImageView
保留在一个 5x5 数组中并在其上循环,但循环变量似乎没有进入 setOnClickListener()
函数。它说我需要将 i
和 j
设为 final
但随后它变成常量,因此不起作用。下面的代码是我试过的,但不是那样工作的。
final ImageView[][] tiles = {{findViewById(R.id.tile00), findViewById(R.id.tile01), findViewById(R.id.tile02),...},
{findViewById(R.id.tile10), ...,}};
for (int i=0; i<3;i++){
for (int j=0; j<3; j++){
tiles[i][j].setImageResource(inputTiles[indexMat[i][j]]);
tiles[i][j].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
indexMat[i][j] = //doesn't work
}
});
}
}
有什么想法吗?
最简单的方法是使用 RecyclerView
和 GridLayoutManager
。这里有一个 关于如何在 RecyclerView
中实现你想要的功能。
在 RecyclerView
中设置这些图像后,您可以根据点击的位置轻松地在 onBindViewHolder
函数中管理点击侦听器。
我是 Android 开发(和 Java)的初学者。我在布局(二维图像数组)中有许多 ImageView
。我想要实现的是,每次当我点击 ImageView
时,它应该根据显示当前图像的某种逻辑从数组中设置图像(例如,数组中的下一张图像,每次点击) .我用谷歌搜索并设法做到了这一点,但它看起来相当长。
public class GameActivity extends AppCompatActivity {
private int [] inputTiles = {R.drawable.one, R.drawable.two, ...// more images};
Random r = new Random();
int matSize = 5;
int[][] indexMat = new int[matSize][matSize];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
for (int i=0; i<matSize; i++) {
for (int j=0; j<matSize; j++) {
indexMat[i][j] = r.nextInt(10);
}
}
final ImageView tile00 = findViewById(R.id.tile00);
tile00.setImageResource(inputTiles[indexMat[0][0]]);
tile00.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
indexMat[0][0] = (indexMat[0][0]+1)%5;
tile00.setImageResource(inputTiles[indexMat[0][0]]);
}
});
final ImageView tile01 = findViewById(R.id.tile01);
tile01.setImageResource(inputTiles[indexMat[0][1]]);
tile01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
indexMat[0][1] = (indexMat[0][1]+1)%5;
tile01.setImageResource(inputTiles[indexMat[0][1]]);
}
});
...// a lot more ImageViews
}
}
假设我正在显示 5x5 的图像网格。我有一个数组 inputTiles
和一个 5x5 数组 indexMat
中的可用图像,用于将当前图像的索引存储在 i
、j
位置。然后,对于每个 ImageView
我正在监听点击并从数组中选择另一个图像来显示。这工作得很好,但在这个特定的例子中,我必须写 "clicklisten and action" 块 25 次。如果有一种方法可以循环它,这样我就可以拥有任何 n x n
网格,那就太好了。
我在谷歌搜索了一下后尝试循环,方法是将 ImageView
保留在一个 5x5 数组中并在其上循环,但循环变量似乎没有进入 setOnClickListener()
函数。它说我需要将 i
和 j
设为 final
但随后它变成常量,因此不起作用。下面的代码是我试过的,但不是那样工作的。
final ImageView[][] tiles = {{findViewById(R.id.tile00), findViewById(R.id.tile01), findViewById(R.id.tile02),...},
{findViewById(R.id.tile10), ...,}};
for (int i=0; i<3;i++){
for (int j=0; j<3; j++){
tiles[i][j].setImageResource(inputTiles[indexMat[i][j]]);
tiles[i][j].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
indexMat[i][j] = //doesn't work
}
});
}
}
有什么想法吗?
最简单的方法是使用 RecyclerView
和 GridLayoutManager
。这里有一个 RecyclerView
中实现你想要的功能。
在 RecyclerView
中设置这些图像后,您可以根据点击的位置轻松地在 onBindViewHolder
函数中管理点击侦听器。