ImageButton邻居验证

时间:2015-03-21 14:19:19

标签: android validation imagebutton

我有一块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。



问题:

  1. 如果已经点击了按钮,我该如何避免再次点击按钮?

  2. 如何启用禁用按钮并避开我的Q1?

  3. 我正在使用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:)

2 个答案:

答案 0 :(得分:0)

避免编写条件代码。如果每次点击图像都是一种不好的做法。因此,您可以创建一个始终保持可点击按钮的arraylist。根据单击的按钮,更改此arraylist。将此列表传递给方法,该方法将为您启用或禁用点击。

答案 1 :(得分:0)

这不是关于ImageButtons,而是基于系统的当前状态,您将使用什么算法或方法来确定哪些区域是可点击的。

我们需要稍微分离逻辑。一方面你有你的观点。我们只需将与更新网格相关的所有内容放入黑框中,比如说void updateGrid(List<List< Boolean>> grid)。让我们维护一个矩阵,其中的条目确定按钮是否可点击。

最初所有按钮都是可点击的。当点击按钮时,您会收到一些通知,例如来自回调void onButtonClick(int i, int j),其中ij给出按钮的位置。我故意对此模糊不清,你最有可能获得id,并且需要自己解决ij职位。在这种情况下,您可能希望将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或类似内容。