我有一块4x4的字母。我想要验证只有那些最靠近被点击/点击/按下的字母的字母必须是可点击的,而其他字母被设置为不可点击。我有我的代码(见下文)for image1。我想到了当我点击它附近的ImageButton时如何启用禁用的ImageButton。
集合示例:
1 | 5 | 9 | 13
2 | 6 | 10 | 14
3 | 7 | 11 | 15
4 | 8 | 12 | 16
如果我单击/按下1,则可以单击2,5和6,其余则不可。然后,我将点击2,并且必须可以点击1,3,5,6和7。
问题:
如果已经点击了按钮,我该如何避免再次点击按钮?
如何启用禁用按钮并避开我的Q1?
我正在使用Android Studio。
码
if (image1.isPressed()) {
image1.setClickable(false);
image2.setClickable(true);
image3.setClickable(false);
image4.setClickable(false);
image5.setClickable(true);
image6.setClickable(true);
image7.setClickable(false);
image8.setClickable(false);
image9.setClickable(false);
image10.setClickable(false);
image11.setClickable(false);
image12.setClickable(false);
image13.setClickable(false);
image14.setClickable(false);
image15.setClickable(false);
image16.setClickable(false);
}
TIA:)
答案 0 :(得分:0)
避免编写条件代码。如果每次点击图像都是一种不好的做法。因此,您可以创建一个始终保持可点击按钮的arraylist。根据单击的按钮,更改此arraylist。将此列表传递给方法,该方法将为您启用或禁用点击。
答案 1 :(得分:0)
这不是关于ImageButtons,而是基于系统的当前状态,您将使用什么算法或方法来确定哪些区域是可点击的。
我们需要稍微分离逻辑。一方面你有你的观点。我们只需将与更新网格相关的所有内容放入黑框中,比如说void updateGrid(List<List< Boolean>> grid)
。让我们维护一个矩阵,其中的条目确定按钮是否可点击。
最初所有按钮都是可点击的。当点击按钮时,您会收到一些通知,例如来自回调void onButtonClick(int i, int j)
,其中i
和j
给出按钮的位置。我故意对此模糊不清,你最有可能获得id
,并且需要自己解决i
和j
职位。在这种情况下,您可能希望将buttonStates和位置封装在某种对象中 - 这取决于您。
private <List<List<Boolean>> mGrid;
private static final int GRID_LENGTH = ...;
private static final int GRID_WIDTH = ...;
private static final defaultValue = false;
public void onButtonClick(int i, int j) {
List<List<Boolean>> newGrid = selectGridRegion(i, j);
updateGrid(newGrid);
}
private List<List<Boolean>> selectGridRegion(int i, int j) {
if (!isValidRegion(i, j)) {
return mGrid;
}
ArrayList<ArrayList<Boolean>> grid = makeGrid();
for (int row = 0; row < GRID_LENGTH; row++) {
ArrayList<Boolean> gridRow = grid.get(row);
for (int col = 0; col < GRID_WIDTH; col++) {
gridRow.set(col, isNeighboringRegion(i, j, row, col));
}
}
return grid;
}
private static boolean isNeighboringRegion(int i, int j, int m, int n) {
return (Math.abs(i - m) == 1 && Math.abs(j - n) == 1);
}
private static List<List<Boolean>> makeGrid() {
ArrayList<ArrayList<Boolean>> grid = new ArrayList<ArrayList<Boolean>>();
for (int i = 0; i < GRID_LENGTH; i++) {
ArrayList<Boolean> row = new ArrayList<Boolean>();
for (int j = 0; j < GRID_WIDTH; j++) {
row.add(defaultValue);
}
grid.add(row);
}
return grid;
}
private static boolean isValidRegion(int i, int j) {
boolean isValid = false;
if (0 <= i && i < GRID_LENGTH) {
if (0 <= j && j < GRID_WIDTH) {
isValid = true;
}
}
return isValid;
}
现在,这是建模网格的一般方法。所有这些方法除了onButtonClick
之外的声音非常类似于它们应该封装在Grid
类中!您可能希望扩展ArrayList
或类似内容。