2012-08-01 3 views
0

에서 레이아웃을 처리하여 짧게 만듭니다.하위보기 Android

저는 Android 메모 작성 프로그램을 개발 중입니다. 여기에 내가하고 싶은 것이있다 : 나는 뷰를 확장하는 커스텀 클래스를 가지고 있는데, 나의 프로그램이 시작할 때 (onCreate)이 메인 뷰에이 커스텀 뷰 (View01)를 추가한다. 그런 다음 내 현재보기 (View01)를 두 번 클릭하면 또 다른보기 (기본 레이아웃 또는 다른 가능한 레이아웃에 추가)를 추가하려고합니다. 내 코드와 같은 것입니다 :

public class NotePanel extends View { 

private long startTime; 
private long endTime; 
private DrawPanel drawPanel; 
private LinearLayout drawLayout; 
final private int pressingTime = 600; 
private Context applicationContext; 

public NotePanel(Context applicationContext) { 
    // TODO Auto-generated constructor stub 
    super(applicationContext); 
    //this.applicationContext = applicationContext; 
    startTime=0; 
    endTime=0; 
    this.setBackgroundColor(Color.BLUE); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event){ 
    if(event.getActionMasked() == MotionEvent.ACTION_DOWN){ 
     startTime = System.currentTimeMillis(); 
     System.out.println("click"); 
    } 

    if(event.getActionMasked() == MotionEvent.ACTION_UP){ 
     endTime = System.currentTimeMillis(); 
     System.out.println(endTime-startTime); 
     if (endTime-startTime >= pressingTime){ 

      drawPanel = new DrawPanel(this.applicationContext); 
      //drawPanel.setVisibility(GONE); 

      drawPanel.setBackgroundColor(Color.RED); 
      //drawLayout = new LinearLayout(applicationContext); 
      drawLayout.addView(drawPanel); 

     } 
    } 

    return true; 
} 

문제는 내가 View01의 drawLayout에 아무것도 할조차 할 수 없다는 것입니다 (이 View01의 내 onTouchEvent 기능의 일부), 나는 안드로이드가 내가 개발에 새로운 해요 여기에 당혹 스럽네. "Activity"가 레이아웃을 처리 할 수있는 클래스 만 확장 되었습니까?

관심을 가져 주셔서 감사합니다.

+0

"View01의 drawLayout에는 아무 것도 할 수 없습니다."-이 부분에 대해 더 자세히 설명해 주시겠습니까? 이게 뭐야? –

답변

0

drawLayout을 전역 변수로 설정하고 onTouch가 아닌 onCreate에 설정해보십시오. 그것이 글로벌 인 onTouch에서 참조 할 수 있어야합니다.

터치 할 때마다 많은 onTouch 이벤트가 발생합니다. 손가락이 위로 올랐는지 확인한 다음 추가해야 할 수도 있습니다. 따라서 무리를 추가하거나 어딘가에 다른 문제가 발생하지 않도록하십시오.

0

가장 쉬운 방법은 사용자 정의보기에서 고유 한 이벤트 유형 및 이벤트 리스너 인터페이스를 정의하는 것입니다. 적절한 사용자 제스처가 감지되면 뷰는 등록 된 리스너에게 이벤트를 알릴 수 있습니다. 그런 다음 사용자 정의 이벤트 리스너를 액티비티에 구현하고 컨테이너 레이아웃의 내용을 업데이트하여 이벤트에 응답 할 수 있습니다. view 또한 view을 확장 View02를 확장 View01 :

까 하나이다 내가 두 개의 클래스가 있다고 가정 :

1

나는 싶은 것은 같은 것입니다 생각합니다. 레이아웃에 뷰를 추가하려면 다음을 수행하십시오.

public class NotePanel extends ViewGroup { 

private long startTime; 
private long endTime; 
private DrawPanel drawPanel; 
//private LinearLayout drawLayout; 
final private int pressingTime = 600; 

public NotePanel(Context applicationContext) { 
    super(applicationContext); 
    startTime=0; 
    endTime=0; 
    this.setBackgroundColor(Color.BLUE); 
    drawPanel = new DrawPanel(applicationContext); 
    this.addView(drawPanel); 
    //drawLayout = new LinearLayout(applicationContext); 
    //drawLayout.addView(drawPanel); 
} 
public NotePanel(Context applicationContext, AttributeSet attrs){ 
    super(applicationContext); 
    startTime=0; 
    endTime=0; 
    this.setBackgroundColor(Color.YELLOW); 
    drawPanel = new DrawPanel(applicationContext); 
    this.addView(drawPanel); 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r,int b){ 

} 

@Override 
public boolean onTouchEvent(MotionEvent event){ 
    if(event.getActionMasked() == MotionEvent.ACTION_DOWN){ 
     startTime = System.currentTimeMillis(); 
     System.out.println("click"); 
    } 

    if(event.getActionMasked() == MotionEvent.ACTION_UP){ 
     endTime = System.currentTimeMillis(); 
     System.out.println(endTime-startTime); 
     if (endTime-startTime >= pressingTime){ 
      drawPanel.setVisibility(VISIBLE); 
      drawPanel.setBackgroundColor(Color.GREEN);    
     } 
    } 

    return true; 
} 

희망이 있습니다. 또한 나는 당신이 view01을 추가하는 방법을 알고 있다고 가정하고, 말하지 않을 경우 예제를 넣을 수 있습니다.

+0

나는 이것을 시도했지만 ACTION_DOWN이 발생하면 응용 프로그램이 강제로 닫히고 다음과 같은 결과가 발생합니다. 예외 입력 이벤트가 발생했습니다. MessageQueue 콜백에서의 예외 : handleReceiveCallback ... 질문에 대한 제 코드를 업데이트했습니다. 좀 더 친절하게 보이시겠습니까? –

+0

예, 코드를 게시 해 보겠습니다. – 0gravity

+0

코드를 원래 질문으로 업데이트했습니다. 고맙습니다 –