2012-12-28 31 views
1

我正試圖在我的應用程序的頁面之間實施滑動操作。我目前有5個XML佈局文件,我可以從一個Activity訪問所有文件。底部有五個按鈕,分別表示每個佈局,按下時切換到相應的XML佈局。使用OnGestureListener或OnGesturePerformedListener在XML佈局之間滑動

我試圖使用OnGestureListener實施刷卡,但它不起作用,因爲我希望它。我需要滑動視圖的Title以便滑動工作。當我滑過佈局中顯示的任何視圖時,它都不起作用。

我開始看,發現GestureOverlayView,這似乎是我想要的。但是,我發現的所有實現都會給我帶來問題。 TutorialSimilar SO question

這是我到目前爲止的代碼:

public class Monitor extends Activity implements android.view.GestureDetector.OnGestureListener, OnGesturePerformedListener { 
    private GestureDetector gestureScanner; 
    private GestureOverlayView gestures; 
    private static final int SWIPE_MIN_DISTANCE = 50; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 50; 
    private GestureLibrary gestureLib; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     gestures = new GestureOverlayView(this); 
     View inflate = getLayoutInflater().inflate(R.layout.main, null); 
     gestures.addView(inflate); 
     gestures.addOnGesturePerformedListener(this); 
     gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures); // Error here 
     if (!gestureLib.load()) { 
      finish(); 
     } 
     setContentView(gestures); 
} 

我上線gestureLib = GestureLibraries.fromRawResource();得到一個錯誤。錯誤是raw cannot be resolved or is not a field.。我的/project-name/res/目錄中沒有raw文件夾。有任何想法嗎?有沒有另一種方法來做到這一點?

這就是我首次實現了只能在標題欄上工作的刷卡功能。

public class Monitor extends Activity implements android.view.GestureDetector.OnGestureListener { 
    private GestureDetector gestureScanner; 
    private static final int SWIPE_MIN_DISTANCE = 50; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 50; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     gestureScanner = new GestureDetector(this); 
     setContentView(R.layout.monitor); 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Log.i("TouchEvent", "Here"); 
     return gestureScanner.onTouchEvent(event); 
    } 

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
     float velocityY) { 
     if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
      && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY 
      ) { 
      Log.i("OnFling", "Right"); 
      //ur code goes here.    
      if(getTitle().equals(getString(R.string.main_analogs))) { 
       setContentView(R.layout.monitor); 
       setTitle(R.string.main_monitor); 
       buildButtons(); 
       if(hasRead) { 
        updateMonitorForm(); 
       } 
      } 
     } 
     /* on scroll to the previous page */ 
     else if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
      && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY 
      ) { 
      Log.i("OnFling", "Left"); 
      //Ur code goes here 
      if(getTitle().equals(getString(R.string.main_monitor))) { 
       setContentView(R.layout.analogs); 
       setTitle(R.string.main_analogs); 
      buildButtons(); 
       if(hasRead) { 
        updateMonitorForm(); 
       } 
      } 
     } 
     return false; 
} 
+0

'ViewPager'沒有幫助嗎? – Luksprog

+0

ViewPager很可能有幫助,但我還沒有找到任何好的例子。我查看了所提供的文檔,但我仍然不完全理解如何實現它。 – JuiCe

回答

2

我想實現我的應用程序頁面之間滑動。我 目前有5個XML佈局文件,我可以從一個 活動訪問所有文件。底部有五個按鈕,分別代表每個 佈局,當按下時切換到相應的XML佈局。

這將是ViewPager小部件的理想場景(除非您忘記添加其他重要細節)。您可以手動滑動ViewPager(因此您不需要自己處理觸摸事件),也可以使用setCurrentItem方法(Buttons部分)設置ViewPager的當前頁面。

我已經根據你的情況做了我的小例子。這個例子很自我解釋,你可以找到它here

+0

謝謝,我沒有時間查看它,但這看起來正是我需要看到的。雖然XML格式的問題。在所有按鈕的例子中的一個。我目前設置的方式是當前的五個單獨的XML佈局。在按鈕偵聽器中使用'setContentView()'進行切換。如果我想要一個空白的平板來放入這五個佈局,我的XML是否只有一個'android.support.v4.view.ViewPager'元素?在LinearLayout中或其他東西? – JuiCe

+0

@JuiCe'ViewPager'將充當'Activity'容器。所以是的,你會將Activity的內容視圖設置爲只包含ViewPager的佈局文件(如果你願意,可以用另一個佈局包裝)。 – Luksprog

+0

這就是我想的,謝謝。那麼在XML文件中有五個按鈕的目的是什麼?他們喜歡ViewPager區域底部的標籤欄嗎? – JuiCe