1

私のアプリケーションのある時点でActivity、データベースから一定量のエントリを受け取るを取得しました。エントリごとにボタンが作成され、レイアウトに追加されます。ボタンを下から上に「押し込む」ようにしたい。APIサンプルを少し編集することでこれを達成しましたpush_up_in.xmlButtonここで気になるのは、すべてが同時に押し込まれているように見えることです。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)を置くだけですが、どちらの場合も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) =>アクティビティが画面に表示されます
->ループ
-> Thread.sleep(x) =>プログラムはxミリ秒待機します
->作成および追加ボタン=>ボタンiがREPEATTILLENDで押され
ます

編集:

これがアニメーション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

よくわかりませんが、 aHandlerを使用するRunnableと問題が解決すると思います。

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、メソッドが呼び出された後に表示されます。そのため、メソッド内で呼び出すことができますが、メソッドはアクティビティが作成されたときにのみ呼び出されるため、メソッドの方が適しています。onResumecreateAndAddButtonsonResumeActivityonStartonStart

私のアドバイスは、 を使用して、 のメソッドHandlerを呼び出します。createAndAddButtonsonStartActivity

ロルフ

コードを少し簡単にする小さな変更:

メイン レイアウトの 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 に答える