1

在我的应用程序中,我得到了一个Activity从数据库接收一定数量的条目。对于每个条目,都会制作一个按钮并将其添加到布局中。我希望按钮从底部到顶部“推入”。我通过稍微编辑 API 示例实现了这一点push_up_in.xml。现在令人不安的是,看起来所有Button的 s 都被同时推入了。Button为了显得更“不同步”,我会在每次按下 a 之间稍作延迟。

到目前为止,相关代码如下所示

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) 放置一个点 (1) 以获得该效果,但在这两种情况下,Activity它本身的开始都会延迟(似乎是 x*fetchedEntries.size()毫秒),并且按钮仍然被挤在一起。在之前的尝试中,我的 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) => Activity 显示在屏幕上
-> 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>
4

1 回答 1

1

我不确定,但我认为Handler使用 aRunnable可以解决您的问题。

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显示在屏幕上

将在调用方法Activity后显示,而onResume不是在设置内容时显示,因此您可以调用您createAndAddButtons的方法,但更好的是方法,因为该方法只会在您的活动创建时调用。onResumeActivityonStartonStart

我的建议,使用Handler并调用你createAndAddButtons的.onStartActivity

罗尔夫

可以使您的代码更容易一点的小改动:

而不是为主布局创建一个 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);
}
于 2012-10-24T10:04:39.877 回答