셀을 터치 할 때마다 셀 값이 변경되는 스도쿠 격자를 만들려고 노력하고 있습니다. 그래서 Child View에 의해 LinearLayout에이 스도쿠 격자를 구현하고 OnTouch 메서드를 사용해 보았지만 작동하지 않습니다. onTouch가 실제로 호출되었는지 여부를 확인하기 위해 log 메소드를 사용했지만이 메소드가 완벽하게 무시 된 것 같습니다. 나는 다른 질문에 대한 해결책을 찾고 있었지만 그 해결책이 도움이되지 못하는 것 같습니다. 여기 좀 빠는 느낌이 들었습니다. 어떤 도움이라도 대단히 감사하겠습니다.[Android] onTouch in child보기가 응답하지 않습니다.
SudokuActivity.java
package snacker.nonogramsolver;
import ...; /*many things are imported here*/
public class SudokuActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sudoku);
Button btn = (Button)findViewById(R.id.btn_clear);
Sudoku sdk = new Sudoku(this);
sdk.setOnTouchListener(sdk);
}
}
;
Sudoku.java
package snacker.nonogramsolver;
import ...;
public class Sudoku extends View implements View.OnTouchListener {
int mWidth = 9;
int mHeight = 9;
int mCellWidth, mCellHeight;
int mCellMargin;
int mEdgeThick;
int mStatus;
int mTextSize;
int mXNow = -1, mYNow = -1;
int[][] mBoard = new int[9][9];
Point mBoardPt;
Paint mTextPaint, mTileEdgePaint;
final static int VALID = 0;
public Sudoku(Context context){
super(context);
initializeBoard();
}
public Sudoku(Context context, AttributeSet attrs){
super(context, attrs);
initializeBoard();
}
@Override
protected void onDraw(Canvas canvas){
/* There are some codes here */
Log.d("LogTest","OnDraw Complete");
}
public void initializeBoard(){
for (int x=0; x< mWidth; x++){
for (int y=0; y< mHeight; y++){
mBoard[x][y] = 0;
}
}
invalidate();
}
public boolean onTouch(View v, MotionEvent event){
Log.d("LogTest","Touched?"); /* LOG NOT ACTIVE HERE */
if(event.getAction() == MotionEvent.ACTION_DOWN){
mXNow = getBoardX(event.getX());
Log.d("LogTest","" + mXNow); /* LOG NOT ACTIVE HERE */
mYNow = getBoardY(event.getY());
Log.d("LogTest","" + mYNow); /* LOG NOT ACTIVE HERE */
mBoard[mXNow][mYNow] = mBoard[mXNow][mYNow] + 1;
invalidate();
return true;
}
else return false;
}
int getBoardX(float scrx){
int x = (int)((scrx)/mCellWidth);
if (x < 0) x = 0;
if (x > 8) x= 8;
return x;
}
int getBoardY(float scry){
int y = (int)((scry)/mCellHeight);
if (y < 0) y = 0;
if (y > 8) y = 8;
return y;
}
}
편집 : 추가 활동 XML 파일
여기 내 코드입니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:id="@+id/activity_sudoku"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="snacker.nonogramsolver.SudokuActivity">
<snacker.nonogramsolver.Sudoku
android:id="@+id/SudokuGrid"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_clear"
android:layout_width="150dp"
android:layout_height="30dp"
android:layout_weight="0.06"
android:text="Clear" />
</LinearLayout>
나는 당신이 거기() 메소드를 활동이 사용자 정의 스도쿠보기로 onTouchListener 설정하고 onTouch을 처리해야 할 것 같아요. 당신은 청취자를 설정하지 않았습니다. btw이 사용자 정의보기를 만들기 위해 귀하의 접근 방식을 좋아합니다. –
@GauravChauhan SudokuActivity에서 OnCreate에 청취자가 있습니다. 어쩌면 이것이 충분하지 않거나 잘못된 접근이었을 까? – SnackerH
sdk.setOnTouchListener (this)와 같은 활동 컨텍스트를 전달하고 activity에서 onTouch를 구현하십시오. –