これまで何時間も検索してきましたが、問題に対する適切な解決策が見つかりませんでした。
私のAndroidアプリケーションをいじって、数独ゲームを作ろうとしています。
TableLayoutは9つのTableRowで構成され、それぞれに9つのTextViewが含まれています。したがって、9 * 9グリッドには、それぞれがOnTouchListenerを持つ81個のTextViewが含まれています。
final OnTouchListener cellTouch = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent e) {
Log.d("TOUCH", "id: "+v.getId() + " "+e.toString());
final int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN: {
// set background to different colour
// set background back if this is different TextView
break;
}
case MotionEvent.ACTION_MOVE: {
break;
}
}
return true;
}
};
OnTouchは個々のTextViewで起動されますが、1つに触れてトラックボールを動かした後、次のことが発生します。
- ACTION_DOWN
- ACTION_MOVEの数
- ACTION_UP
ただし、私が望んでいるのは、OnTouchが他のTextViewを起動し、それらを強調表示することです。セルを作成する方法を以下に示します。
TextView cellLabel = (TextView) inflater.inflate(R.layout.sudoku_cell, tr, false);
cellLabel.setId(curCellId);
cellLabel.setText(""+ curCellId);
cellLabel.setOnTouchListener(cellTouch);
cellLabel.setOnFocusChangeListener(cellFocus);
cellLabel.setOnClickListener(cellClick);
cellLabel.setFocusable(true);
cellLabel.setClickable(true);
cellLabel.setFocusableInTouchMode(true);
個々のセル:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="35dp"
android:layout_weight="1"
android:textSize="18dp"
android:textColor="#FFFFFF"
android:gravity="center"
android:background="@layout/border"
/>
私は非常に多くの異なることを試みてきました。TextViewを決定するなど、ポインタが一番上にありますが、運がありません。
誰かがアイデアを持っていることを願っています。お時間をいただきありがとうございます。
敬具。
編集
TextView [] []をループして、適切なセルを見つける検索関数。ただし、行ベースでのみ機能します。ある行から別の行に切り替えると、機能しません。
private TextView getCell (View v, MotionEvent e) {
float x = e.getX();
float y = e.getY();
for (int i = 0; i < GRID_HEIGHT; i++) {
for (int j = 0; j < GRID_WIDTH; j++) {
TextView tv = tvGrid[i][j];
Rect rectView = new Rect(tv.getLeft(), tv.getTop(), tv.getRight(), tv.getBottom());
if(rectView.contains((int)x, (int)y)) {
return tv;
}
}
}
return null;
}