2014-03-25 49 views
0

好吧,所以我一直在我的應用程序中使用手勢工作了兩天。它是一個基本的秒錶應用程序,也是一個倒計時應用程序,它使用可滑動視圖在兩個不同的活動之間進行切換。將onToubleTapListener附加到文本視圖

我的問題是在我的應用程序的秒錶部分的第一個片段我使用runnable來創建並啓動計時器,它可以正常工作,並且它當前已設置,所以如果用戶點擊計時器文本視圖,開始運行,計時器開始計數。但是,我設置它的方式只能接受一種單擊的輸入法。這是手勢進入的地方。我想單擊以啓動計時器,雙擊可暫停計時器,長按可停止並清除計時器文本視圖。

我已經嘗試過將手勢檢測器附加到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); 
} 

}