2017-05-16 16 views
1

셀을 터치 할 때마다 셀 값이 변경되는 스도쿠 격자를 만들려고 노력하고 있습니다. 그래서 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> 
+0

나는 당신이 거기() 메소드를 활동이 사용자 정의 스도쿠보기로 onTouchListener 설정하고 onTouch을 처리해야 할 것 같아요. 당신은 청취자를 설정하지 않았습니다. btw이 사용자 정의보기를 만들기 위해 귀하의 접근 방식을 좋아합니다. –

+0

@GauravChauhan SudokuActivity에서 OnCreate에 청취자가 있습니다. 어쩌면 이것이 충분하지 않거나 잘못된 접근이었을 까? – SnackerH

+0

sdk.setOnTouchListener (this)와 같은 활동 컨텍스트를 전달하고 activity에서 onTouch를 구현하십시오. –

답변

0

직접 단지 스도쿠 클래스의 객체를 생성하여 touchListener을 추가 할 수 없습니다. xml 또는 프로그램 방식으로보기를 추가해야합니다.

귀하의 활동

public class MyActivity extends Activity{ 
    @Override 
protected void onCreate(Bundle savedInstanceState){ 
super.onCreate(savedInstanceState); 

//initializing custom views 
MyCustomView1 myCustomView1 = new MyCustomView1(parameterList); 
MyCustomView2 myCustomView2 = new MyCustomView2(parameterList); 

//adding both custom views to the main activity 
mainView.addView(myCustomView1); 
mainView.addView(myCustomView1); 

//adding custom listener to the custom view 1 
myCustomView1.setCustomEventListener(new OnCustomEventListener() { 

    @Override 
    public void onEvent() { 
     //firing an event of custom view 1 
     Toast.makeText(MainActivity.this, "Touched custom view 1", 
       Toast.LENGTH_SHORT).show(); 
    } 
}); 

//adding custom listener to the custom view 2 
myCustomView2.setCustomEventListener(new OnCustomEventListener() { 

    @Override 
    public void onEvent() { 
     //firing an event of custom view 2 
     Toast.makeText(MainActivity.this, "Touched custom view 2", 
       Toast.LENGTH_SHORT).show(); 
    } 
}); 
} 
} 

귀하있는 CustomView 1

public class MyCustomView1 extends LinearLayout{ 
OnCustomEventListener myCustomEventListener; 

public MyCustomView1(ParameterList){ 
super(ContextFromParameterList); 
//Just adding something to the custom view 1 in order to distinguish it on the screen 
TextView tv = new TextView(ContextFromParameterList); 
tv.setText("Hello world from custom view 1"); 
addView(tv); 

this.setOnTouchListener(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     //delegating one event to another (delegating touch event to custom event) 
     if (MyCustomView1.this.myCustomEventListener != null) 
      MyCustomView1.this.myCustomEventListener.onEvent(); 
     return false; 
    } 
}); } 

공공 무효 setCustomEventListener (OnCustomEventListener 의 EventListener) { // 활동에서 사용자 정의 리스너를 설정 myCustomEventListener =의 EventListener; }}

귀하의 CustomView2

public class MyCustomView2 extends LinearLayout { 
OnCustomEventListener myCustomEventListener; 

public MyCustomView2(ParameterList) { 
    super(ContextFromParameterList); 
//Just adding something to the custom view 1 in order to distinguish it on the screen 
TextView tv = new TextView(ContextFromParameterList); 
tv.setText("Hello world from custom view 2"); 
addView(tv); 

this.setOnTouchListener(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     //delegating one event to another (delegating touch event to custom event) 
     if (MyCustomView2.this.myCustomEventListener != null) 
      MyCustomView2.this.myCustomEventListener.onEvent(); 
     return false; 
    } 
}); 
} 

    public void setCustomEventListener(OnCustomEventListener eventListener) { 
    //setting custom listener from activity 
    myCustomEventListener = eventListener; 
    } 
} 
Your listener interface: 

public interface OnCustomEventListener{ 
//interface defines one method. Can be more and methods may have parameters 
public void onEvent(); 
} 
+0

죄송합니다. xml 파일에 사용자 정의보기를 추가했음을 잊어 버렸습니다 ... – SnackerH

+0

그 코드를 추가 할 수 있습니까? 그래서 아이디어를 얻을 수 있습니까? – Dany

+0

거기에는 많은 코드가 없지만 완료되었습니다. – SnackerH