2012-12-20 24 views
0

的事情很簡單,我想我的應用程序有消息飼料和IAM嘗試這樣做,通過textswitcher,但其崩潰的應用程序ActionBarSherlock SherlockFragment問題與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; 
    }  


} 

和日誌貓輸出

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) 

回答

2

每個視圖都有一個現有的處理程序,您不需要在新線程上使用TimerTask。試試這個:

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); 

你應該取消所有待處理的Runnable在onPause()有:

tw.removeCallback(pageTurner); 
1

包裹setText中的呼叫runOnUiThread,你需要得到,雖然活動:

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

還有一些其他的方式來得到這個工作。 http://stackoverflow.com/questions/10352259/using-toast-inside-timertask – dmon

+0

我如何使用計時器來改變一定的時間間隔後的文本 –

相關問題