2012-12-20 5 views
0

la chose est simple, je veux que mon application d'avoir flux de nouvelles et iam essayant de le faire via textswitcher, mais son application se écraserquestion ActionBarSherlock SherlockFragment avec TextSwitcher

public class HomeFragment extends SherlockFragment implements ViewFactory{ 
    List<String> newsList = new ArrayList<String>(); 
    TextSwitcher tw; 
    int position = 0; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     View v = inflater.inflate(R.layout.home_fragment, null, false); 

     //TextView news = (TextView)v.findViewById(R.id.app_bottom_news); 
     //news.setSelected(true); 
     newsList.add("String 1 String 1 String 1 String 1 String 1"); 
     newsList.add("String 2 String 2 String 2 String 2 String 2"); 
     newsList.add("String 3 String 3 String 3 String 3 String 3"); 
     newsList.add("String 4 String 4 String 4 String 4 String 4"); 
     newsList.add("String 5 String 5 String 5 String 5 String 5"); 
     newsList.add("String 6 String 6 String 6 String 6 String 6"); 

     tw = (TextSwitcher)v.findViewById(R.id.app_bottom_news); 

     Animation in = AnimationUtils.makeInAnimation(getActivity(), true); 
     Animation out = AnimationUtils.makeOutAnimation(getActivity(), true); 
     tw.setFactory(this); 
     tw.setInAnimation(in); 
     tw.setOutAnimation(out); 
     tw.setText(String.valueOf(newsList.get(position))); 
     TimerTask tm = new TimerTask(){ 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      if(position < newsList.size()){ 
       position++; 
       tw.setText(String.valueOf(newsList.get(position))); 
      }else{ 
       position = 0; 
      } 
     } 

     }; 
     Timer t = new Timer(); 
     t.schedule(tm, 2000); 
     } 
     @Override 
    public View makeView() { 
     // TODO Auto-generated method stub 
     TextView txtView = new TextView(getActivity()); 
     txtView.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL); 
     txtView.setTextSize(20); 
     return txtView; 
    }  


} 

et le journal de sortie Cat est

12-20 16:44:16.882: W/dalvikvm(1838): threadid=11: thread exiting with uncaught exception (group=0x40a13300) 
12-20 16:44:16.937: E/AndroidRuntime(1838): FATAL EXCEPTION: Timer-1 
12-20 16:44:16.937: E/AndroidRuntime(1838): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4609) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:835) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:292) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.view.View.requestLayout(View.java:15129) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.widget.TextView.checkForRelayout(TextView.java:6309) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.widget.TextView.setText(TextView.java:3547) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.widget.TextView.setText(TextView.java:3405) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.widget.TextView.setText(TextView.java:3380) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at android.widget.TextSwitcher.setText(TextSwitcher.java:80) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at net.evolution.betting.application.HomeFragment$1.run(HomeFragment.java:59) 
12-20 16:44:16.937: E/AndroidRuntime(1838):  at java.util.Timer$TimerImpl.run(Timer.java:284) 

Répondre

2

Chaque vue possède un gestionnaire existant dont vous n'avez pas besoin pour utiliser une TimerTask sur un nouveau thread. Essayez ceci:

pageTurner = new Runnable() { 
    @Override 
    public void run() { 
     if(position < newsList.size()){ 
      position++; 
      tw.setText(String.valueOf(newsList.get(position))); 
     }else{ 
      position = 0; 
     } 

     // This line will run the timer again if you want 
     //tw.postDelayed(this, 2000); 
    } 
}; 
tw.postDelayed(pageTurner, 2000); 

Vous devez annuler toute attente en runnables onPause() avec:

tw.removeCallback(pageTurner); 
1

Enveloppez l'appel setText dans un runOnUiThread, vous devez obtenir l'activité si:

Activity a = getActivity(); 
if (a != null) { 
    a.runOnUiThread(new Runnable() { ... }); 
} 
+0

Il y a aussi quelques autres façons d'obtenir ce travail. http://stackoverflow.com/questions/10352259/using-toast-inside-timertask – dmon

+0

Comment puis-je utiliser minuterie avec ceci pour changer le texte après un certain intervalle de temps –

Questions connexes