2012-10-24 120 views
1

在我的應用程序中,我得到了一個Activity,它從數據庫接收一定數量的條目。對於每個條目,製作一個按鈕並添加到佈局中。我希望按鈕從底部到頂部「推入」。我通過對API示例push_up_in.xml進行了輕微修改來實現這一目標。現在令人不安的是,它看起來像是所有的Button都被同時推入。爲了看起來更「不同步」,我會在每次推動Button之間稍微延遲一段時間。Android:從底部按下按鈕延遲

到目前爲止,相關的代碼如下所示

public void onCreate(Bundle icicle){ 
    super.onCreate(icicle); 
    getDestinationLayout(); 
    setContentView(linearLayout); 
    challengeName = getIntent().getExtras().getString("challengeName"); 
    context = this; 
    datasource = new CustomDataSource(this); 
    showGames();  
} 

(...) 

private void getDestinationLayout(){ 
     linearLayout = (LinearLayout) getLayoutInflater().inflate(R.layout.main_all_entries, null); 
     scrollView = (ScrollView) linearLayout.findViewById(R.id.rel_all_football); 
     buttonHolder = (LinearLayout) scrollView.findViewById(R.id.lin_all_buttonholder); 
    } 

// is called from showGames() after taking fetched entries, sorted them and so on 
private void createAndAddButtons(){ 
    // the fetched entries are taken in another method 
    for(int i=0; i<fetchedEntries.size(); i++){ 
     (1) 
     entryButton = new Button(this) //entryButton is global 
     // do some layout stuff 
     entryButton.setAnimation(AnimationUtils.loadAnimation(this, R.anim.push_up_in)); 
     (2) 
     buttonHolder.add(entryButton); 
    } 
} 

現在我想,沒問題,我只是把一個Thread.sleep(x)點(1)分別在點(2),以獲得這種效果,但在這兩種情況下Activity本身的開始都被延遲了(對於x * fetchedEntries.size() millis來說似乎是這樣),並且按鈕仍然被推在一起。在以前的嘗試,我的onCreate就像

public void onCreate(Bundle icicle){ 
    super.onCreate(icicle); 
    challengeName = getIntent().getExtras().getString("challengeName"); 
    context = this; 
    datasource = new CustomDataSource(this); 
    showGames(); 
    setContentView(linearLayout); 
} 

(而getDestinationLayout()showGames()內),問題是,我第一次添加的按鈕,然後調用setContentView(linearLayout)(我現在覺得是錯的的確是接近我的目標),但正如所說的,實際的版本不是我想要的。我怎樣才能做到這一點?顯然,這個問題是使用Thread.sleep(x),但另一方面我完全不明白爲什麼,因爲邏輯上的程序應該是

- >setContentView(linearLayout) =>活動將顯示在屏幕上
- > LOOP
- >Thread.sleep(x) =>程序等待X米利斯
- >創建和添加按鈕=>按鈕i在
REPEAT推TILL END

編輯:

這裏是動畫xml文件 「push_up_in.xml」

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="300"/> 
    <alpha android:fromAlpha="0.5" android:toAlpha="1.0" android:duration="1000" /> 
</set> 

回答

1

我不知道,但我使用Runnable將解決您的問題,認爲Handler

private void createAndAddButtons(){ 
    Handler h = new Handler(); 

    //h.post(
    h.postDelayed(new Runnable(){ 
     public void run() { 
      // the fetched entries are taken in another method 
      for(int i=0; i<fetchedEntries.size(); i++){ 
       entryButton = new Button(this) //entryButton is global 
       // do some layout stuff 
       entryButton.setAnimation(AnimationUtils.loadAnimation(this, R.anim.push_up_in)); 
       buttonHolder.add(entryButton); 
      } 

     } 
    }, 3000); 

} 

另外:

- >的setContentView(LinearLayout中)=>活動被顯示在屏幕

Activity將被顯示時設置的所述onResume方法被調用後不內容,因此您可以撥打createAndAddButtons,ActivityonResume,但更好的方法是onStart方法,因爲onStart方法只會在您的活動爲c時調用reated。

我的建議是,使用Handler並在ActivityonStart中調用createAndAddButtons方法。

而不是創建爲主要佈局的LinearLayout對象和膨脹比設置它和:

羅爾夫

小的變化,可以使你的代碼更容易一點。爲什麼不這樣做呢?

private void getDestinationLayout(){ 
     setContentView(R.layout.main_all_entries); 
     scrollView = (ScrollView) linearLayout.findViewById(R.id.rel_all_football); 
     buttonHolder = (LinearLayout) scrollView.findViewById(R.id.lin_all_buttonholder); 
} 
+0

但是然後(所以我想乍看之下),按鈕的單個添加之間沒有延遲,對不對?將該處理程序放在for循環中會更好嗎?或者從foor循環中的處理程序調用一些延遲函數?編輯:只需閱讀您的編輯,謝謝澄清! –

+0

只需在你的循環中添加Thread.sleep() –

+0

好吧,我完全按照你的建議,從onCreate獲取所有條目,並從onStart()調用createAndAddButtons()。在那裏,我在上面的答案中放置了一個處理程序,並在循環中放入了Thread.sleep(),但問題仍然存在。爲了測試它,我放入了一個Thread.sleep(1000),並且由於在我的測試中db有15個條目,所以在任何獲取displayd之前它會休眠15秒。在此15秒之後,活動顯示並且按鈕被「一起」推入。我忽視了什麼? –