4

簡単な質問のようですが、私の人生ではこれを理解することはできません...

会社のロゴ、基本的にはスプラッシュ画面を表示するメインアクティビティがあります。これを2秒ほど表示して、実際のアプリケーションのメインアクティビティにフェードアウトさせたいです。スリープを使用して実装しようとしましたが、これを行うと、ロゴアクティビティの空白の画面が表示されます。スリープが完了するまで画像が読み込まれないようです。つまり、基本的にアプリが起動し、2秒間黒い画面が表示されてから、アプリケーションに移行します。戻ると、ロゴが表示されます。私はここで何が間違っているのですか?これは私のロゴコードです。logo.xmlには、描画可能なリソースを持つ単一のImageViewがあります。

public class Logo extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.logo);

        // Intent to jump to the next activity
        Intent intent= new Intent(this, NextActivity.class);
        this.startActivity(intent);

        SystemClock.sleep(2000);
    }
}
4

4 に答える 4

8

あなたはUIスレッドをブロックしていますが、これは大したことではありません。onCreateメソッドが戻るまで、システムは画面を描画できません。必要なことを行う一般的な方法は、別のスレッドを開始して待機し、Runnable を UI スレッドに投稿することです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.logo);
    final Handler handler = new Handler();
    final Runnable doNextActivity = new Runnable() {
        @Override
        public void run() {
            // Intent to jump to the next activity
            Intent intent= new Intent(this, NextActivity.class);
            startActivity(intent);
            finish(); // so the splash activity goes away
        }
    };

    new Thread() {
        @Override
        public void run() {
            SystemClock.sleep(2000);
            handler.post(doNextActivity);
        }
    }.start();
}

もう少し簡単な方法 (Athmos が彼の回答で提案したように) は、ハンドラーにカウントダウンを行わせることです。

Handler mHandler;
Runnable mNextActivityCallback;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.logo);
    mHandler = new Handler();
    mNextActivityCallback = new Runnable() {
        @Override
        public void run() {
            // Intent to jump to the next activity
            Intent intent= new Intent(this, NextActivity.class);
            startActivity(intent);
            finish(); // so the splash activity goes away
        }
    };
    mHandler.postDelayed(mNextActivityCallback, 2000L);
}

これには、次のアクティビティに進むのをキャンセルできるという利点があります (たとえば、使用者が [戻る] ボタンを押した場合、またはその 2 秒間にエラー状態または何かを検出した場合)。

@Override
protected void onPause() {
    if (isFinishing()) {
        mHandler.removeCallbacks(mNextActivityCallback);
    }
}
于 2012-06-21T00:57:47.920 に答える
0

onResume() と Handler を使用する、簡単でクリーンな方法

これを入れてみましたか...

// Intent to jump to the next activity
Intent intent= new Intent(this, NextActivity.class);
SystemClock.sleep(2000); //NOTE before the start of the next activity
this.startActivity(intent);

... onResume(); で

私の知る限り、 onCreate() が呼び出されたときに Activity が表示されるという考えではありません。しかし、 onResume() は常に呼び出され、私が知る限り、それまでにすべてが表示されるはずです。一度だけ表示したい場合は、フラグを作成します。参照:アクティビティのライフサイクル

とにかく、間違った方法でやっている ;) これには Handler 、 Thread などを使用します

その他の解決策:

  • すべての前に ImageView を表示し、2 秒後に非表示にしないのはなぜですか? Handler遅延にa を使用できます。または、透明度を使用して派手なフェードアウトを作成することもできます。を見てくださいImageView setAlpha(...)
  • Handlerの代わりにa を使用しないのはなぜですかsleep(...)。私見sleep(...)は「アプリケーションが応答しない」という結果になる可能性があります

このコードは仕事に必要です:

Handler mHandler = new Handler();

class MyTask implements Runnable{
    public void run(){
        //start next activity or fadeout ImageView or ...
    }
}

onResume を呼び出します。

mHandler.postDelayed(new MyTask(), 100); //or any other Runnable
于 2012-06-21T01:06:51.360 に答える
0

コンストラクターでスリープを使用する代わりに、ビューの構築を 2 秒遅らせるため、2 秒後にのみ画像が表示されます。こちらのアドバイスに従ってみてください。

http://androidforums.com/40306-post4.html 戻るボタンの問題についても追加

android:noHistory="true"

ロゴ アクティビティのマニフェストに

于 2012-06-21T00:58:03.897 に答える
0

oncreate メソッドの実行を停止し、setcontentview を設定した後に使用できるため、新しいスレッドでスリープを使用する必要があります。

于 2013-07-07T13:30:49.750 に答える