2013-06-18 17 views
15


Desidero pianificare un'azione per modificare automaticamente le pagine di ViewPager. Ho provato:Android ViewPager cambia automaticamente pagina

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

    ... 

    swipeTimer = new Timer(); 
    swipeTimer.schedule(new TimerTask() { 

     @Override 
     public void run() { 
      if (currentPage == NUM_PAGES) { 
       currentPage = 0; 
      } 
      featureViewPager.setCurrentItem(currentPage++, true); 
     } 
    }, 100, 500); 

ma sto ottenendo sempre:

E/AndroidRuntime(5381): FATAL EXCEPTION: Timer-0 
E/AndroidRuntime(5381): java.lang.IllegalStateException: Must be called from main thread of process 

Sono già in proprio filo conduttore? Come posso risolvere questo?
Grazie per il vostro tempo.

==================================== EDIT: ===== ================

Grazie per tutte le vostre risposte. Sulla base di queste risposte mi sono imbattuto in 2 soluzioni:
Soluzione 1:

swipeTimer = new Timer(); 
      swipeTimer.schedule(new TimerTask() { 

       @Override 
       public void run() { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          if (currentPage == NUM_PAGES) { 
           currentPage = 0; 
          } 
          featureViewPager.setCurrentItem(currentPage++, true); 
         } 
        }); 
       } 
      }, 500, 3000); 

Soluzione 2:

final Handler handler = new Handler(); 
       final Runnable Update = new Runnable() { 
        public void run() { 
         if (currentPage == NUM_PAGES) { 
          currentPage = 0; 
         } 
         featureViewPager.setCurrentItem(currentPage++, true); 
        } 
       }; 

      swipeTimer = new Timer(); 
      swipeTimer.schedule(new TimerTask() { 

       @Override 
       public void run() { 
        handler.post(Update); 
       } 
      }, 500, 3000); 

che uno è migliore o sono la stessa cosa?
Grazie ancora.

+0

è possibile utilizzare il ricevitore broadcast per modificare la pagina sul tempo specifico, registrare il ricevitore e lo chiamano quando u vuole cambiare l'assegno pagina – abhi

+1

[questo] (http://stackoverflow.com/a/9738560/2479292 fuori. – zozelfelfo

+0

Dovresti usare un ViewAnimator (ad es. ViewFlipper: http://developer.android.com/reference/android/widget/ViewFlipper.html) e ti renderà il lavoro più semplice o userai un Handler (costruito nel thread principale: http: //developer.android.com/reference/android/os/Handler.html) – Laviniux

risposta

48

Se si desidera utilizzare thread nel principale dell'interfaccia utente, allora avete bisogno di utilizzare curva a portata di mano.

Handler handler = new Handler(); 

     Runnable update = new Runnable() { 
      public void run() { 
       if (currentPage == NUM_PAGES - 1) { 
        currentPage = 0; 
       } 
       featureViewPager.setCurrentItem(currentPage++, true); 
      } 
     }; 


     new Timer().schedule(new TimerTask() { 

      @Override 
      public void run() { 
       handler.post(update); 
      } 
     }, 100, 500); 
+1

nuovo Handler() postDelayed (new Runnable() { public void run() {if ( currentPage == NUM_PAGES - 1) { currentPage = 0;} featureViewPager. setCurrentItem (currentPage ++, true); } }, 3000); Funzionerà ?? –

+1

come cambiare la velocità ?? –

+1

Ho un massimo di 3 pagine, 'if (currentPage == NUM_PAGES - 1) { currentPage = 0; } featureViewPager.setCurrentItem (currentPage ++, true); ' Ho trovato questo errato, il mio indice di pagine era 0,1,2 - scorrerà nella seconda, ma non continuerà al 2 (indice della pagina) . – RoCk

2

TimerTask verrà eseguito nella sua thread (= non il thread dell'interfaccia utente).

È possibile chiamare setCurrentItem direttamente sul thread principale utilizzando un gestore.

10

modo più semplice come risolverlo è quello di creare un eseguibile postDelayed

private Handler mHandler; 
    public static final int DELAY = 5000; 

    Runnable mRunnable = new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      //TODO: do something like mViewPager.setCurrentPage(mIterator); 
      mHandler.postDelayed(mRunnable , DELAY); 
     } 
    }; 

come si può vedere in loop infinitelly. Quando si vuole fermare, basta semplicemente chiamare

 mHandler.removeCallbacks(mRunnable); 
Problemi correlati