2014-03-25 4 views
0

좋아, 이제 며칠 동안 내 앱에서 제스처로 작업했습니다. 모든 것은 기본 스톱워치 애플리케이션이며 카운트 다운 애플리케이션은 스 와이프 가능한 뷰를 사용하여 2 가지 다른 활동을 교환합니다.onDoubleTapListener를 텍스트보기에 첨부하십시오.

내 문제는 app의 stopWatch 부분에 대한 첫 번째 단편입니다. 실행 가능한 타이머를 만들고 시작하는 타이머가 있습니다. 사용자가 타이머 텍스트보기를 탭하면 현재 설정되어 있습니다. 실행 파일을 시작하면 타이머가 카운트를 시작합니다. 그러나 내가 설정 한 방법은 단일 탭인 하나의 입력 방법 만 허용 할 수 있습니다. 이것은 제스처가 들어오는 곳입니다. 타이머를 시작하려면 한 번 클릭하고, 타이머를 일시 중지하려면 두 번 살짝 누르고, 타이머 텍스트보기를 중지하고 지우려면 길게 누릅니다.

제스처 탐지기를 TextView에 연결하려고 시도했지만 아무 것도 작동하지 않는 것 같아요. 조각을 설정할 수 있다고 생각합니다. 화면의 아무 곳이나 클릭하면 내가 할 수 있다고 생각합니다. 소원하지만 나는 그런 식으로 일하기를 원하지 않아. 사용자가 타이머 텍스트보기를 클릭 할 때만 작동되기를 원합니다. 나는 그것이 작동하도록 할 수 있다고 생각했지만, 그것은 TextView에 onDoubleTapListener를 두는 것과 관련이 있습니다. 그러나 어떤 이유로 그것을 할 수 없기 때문에, 누군가는 저를 위해 또는 그 방법을 사용할 수있는 방법을 가지고 있습니다. 코드가 작동합니까? 사람이 :)

아래는 내 코드입니다 수 있도록하는

긴 설명을 드려 죄송

하지만 난 내가 원하는 걸에 있습니다 더 많은 정보를 파악, 쉽게 그것을 것, 내가 너무 보이지 않는 알고 (내가 일하려고하는 것 같은) 조직되었지만 잘하면 내가 잘못 될 곳을 볼 수있다. 감사!

(일부보기는 순식간에 한 번에 한 단계 씩 작업하기 때문에 전혀 사용되지 않습니다. P는 주석 처리 된 코드의 일부이며 현재 방식입니다. 나는 내가 현재 타이머를 시작하고 어떻게 여기 경우에 누군가가 궁금해 그것을 떠날 거라고 생각 타이머를 실행하는거야.) 내가 그렇게 간단 문제를 파악

package com.leccles.swipetabs; 

import android.os.Bundle; 
import android.os.Handler; 
import android.support.v4.app.Fragment; 
import android.support.v4.view.GestureDetectorCompat; 
import android.view.GestureDetector; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 

/** 
* A simple {@link android.support.v4.app.Fragment} subclass. 
* 
*/ 
public class FragmentA extends Fragment implements 
    GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { 
Button lapButton; 
TextView timerText; 
ListView lapListView; 
TextView mMilliTextView; 
String milliText; 
long startTime = 0; 
long timeInMilliSeconds = 0; 
GestureDetectorCompat gDetector; 

Handler timerHandler = new Handler(); 
Runnable timerRunnable = new Runnable() { 

    @Override 
    public void run() { 
     long millis = System.currentTimeMillis() - startTime; 
     int seconds = (int) (millis/1000); 
     int minutes = seconds/60; 
     seconds = seconds % 60; 

     timerText.setText(String.format("%d:%02d", minutes, seconds)); 
     timerHandler.postDelayed(this, 500); 
    } 

}; 

public FragmentA() { 
    // Required empty public constructor 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    // Inflate the layout for this fragment 
    mMilliTextView = (TextView) getView().findViewById(R.id.milliTextView); 
    lapButton = (Button) getView().findViewById(R.id.lapButton); 
    timerText = (TextView) getView().findViewById(R.id.timerText); 
    lapListView = (ListView) getView().findViewById(R.id.lapListView); 

    this.gDetector = new GestureDetectorCompat(getActivity(), this); 

    timerText.setOnDoubleTapListener(this); 

    /* 
    * timerText.setOnClickListener(new View.OnClickListener() { 
    * 
    * @Override public void onClick(View v) { TextView timerText = 
    * (TextView) v; if (timerText.getText().equals(
    * getView().findViewById(R.string.stopWatchTime))) { 
    * timerHandler.removeCallbacks(timerRunnable); 
    * 
    * } else { 
    * 
    * startTime = System.currentTimeMillis(); 
    * timerHandler.postDelayed(timerRunnable, 0); 
    * 
    * } 
    * 
    * } 
    * 
    * }); 
    */ 
} 

@Override 
public boolean onSingleTapConfirmed(MotionEvent e) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public boolean onDoubleTap(MotionEvent e) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public boolean onDoubleTapEvent(MotionEvent e) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public boolean onDown(MotionEvent e) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public void onShowPress(MotionEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public boolean onSingleTapUp(MotionEvent e) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
     float distanceY) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public void onLongPress(MotionEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
     float velocityY) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    return inflater.inflate(R.layout.fragment_a, container, false); 
} 

} 

답변

1

. onDoubleTapListener를 사용할 필요가 없었습니다. 간단한 onTouchListener가 작동했습니다 (이전에 시도해 보았지만 사용하지 못했습니다). 잘못 사용하려고했습니다. 제스처 탐지기를 온 터치에 두지 않았으므로 작동하지 않습니다. 다음은 onTouchListener와 함께 작동하는 코드입니다. 터치가 처리되었다는 사실을 밝히기 위해 onTouch의 부울을 true로 변경하지 않았습니다.

package com.leccles.swipetabs; 

import android.os.Bundle; 
import android.os.Handler; 
import android.support.v4.app.Fragment; 
import android.support.v4.view.GestureDetectorCompat; 
import android.view.GestureDetector; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 

/** 
* A simple {@link android.support.v4.app.Fragment} subclass. 
* 
*/ 
public class FragmentA extends Fragment implements 
    GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { 
Button lapButton; 
TextView timerText; 
ListView lapListView; 
TextView mMilliTextView; 
String milliText; 
long startTime = 0; 
String sPauseTime; 
long iPauseTime; 
long timeInMilliSeconds = 0; 
GestureDetectorCompat gDetector; 

Handler timerHandler = new Handler(); 
Runnable pauseRunnable = new Runnable() { 

    @Override 
    public void run() { 
     long millis = System.currentTimeMillis() + startTime; 
     int seconds = (int) (millis/1000); 
     int minutes = seconds/60; 
     seconds = seconds % 60; 

     timerText.setText(String.format("%02d:%02d", minutes, seconds)); 
     timerHandler.postDelayed(this, 500); 

    } 
}; 

Runnable timerRunnable = new Runnable() { 

    @Override 
    public void run() { 
     long millis = System.currentTimeMillis() - startTime; 
     int seconds = (int) (millis/1000); 
     int minutes = seconds/60; 
     seconds = seconds % 60; 

     timerText.setText(String.format("%02d:%02d", minutes, seconds)); 
     timerHandler.postDelayed(this, 500); 
    } 

}; 

public FragmentA() { 
    // Required empty public constructor 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    // Inflate the layout for this fragment 
    mMilliTextView = (TextView) getView().findViewById(R.id.milliTextView); 
    lapButton = (Button) getView().findViewById(R.id.lapButton); 
    timerText = (TextView) getView().findViewById(R.id.timerText); 
    lapListView = (ListView) getView().findViewById(R.id.lapListView); 

    this.gDetector = new GestureDetectorCompat(getActivity(), this); 

    timerText.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      gDetector.onTouchEvent(event); 
      return true; 
     } 
    }); 

    /* 
    * timerText.setOnClickListener(new View.OnClickListener() { 
    * 
    * @Override public void onClick(View v) { TextView timerText = 
    * (TextView) v; if (timerText.getText().equals(
    * getView().findViewById(R.string.stopWatchTime))) { 
    * timerHandler.removeCallbacks(timerRunnable); 
    * 
    * } else { 
    * 
    * startTime = System.currentTimeMillis(); 
    * timerHandler.postDelayed(timerRunnable, 0); 
    * 
    * } 
    * 
    * } 
    * 
    * }); 
    */ 
} 

@Override 
public boolean onSingleTapConfirmed(MotionEvent e) { 
    sPauseTime = timerText.getText().toString(); 
    startTime = System.currentTimeMillis(); 
    timerHandler.postDelayed(timerRunnable, 0); 

    return true; 
} 

@Override 
public boolean onDoubleTap(MotionEvent e) { 
    sPauseTime = timerText.getText().toString(); 
    timerHandler.removeCallbacks(timerRunnable); 

    return true; 
} 

@Override 
public boolean onDoubleTapEvent(MotionEvent e) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public boolean onDown(MotionEvent e) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public void onShowPress(MotionEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public boolean onSingleTapUp(MotionEvent e) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
     float distanceY) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public void onLongPress(MotionEvent e) { 
    timerHandler.removeCallbacks(timerRunnable); 
    timerText.setText("00:00"); 

} 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
     float velocityY) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    return inflater.inflate(R.layout.fragment_a, container, false); 
} 

}

관련 문제