1

Android アプリケーションの読み込み中に、起動の最初の 2,3 秒間にロゴを表示したいのですが、起動後に UI を表示するよりも見苦しくないと思います。したがって、私のコードでは、最初にロゴ付きの setContentView (スプラッシュ) を作成し、その後に UI (メイン) 付きの setContentView を作成します。pb では、ロゴ画面が表示されず、黒い画面が表示されます。私はそれをメインスレッドで行っているので、理解できません。問題の説明と、可能であれば回避策はありますか?

アクティビティの onCreate() がうまく機能しないのは次のとおりです (5 秒間黒い画面が表示された後、UI が表示されますが、例外はスローされません)。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash); //doesn't work
    Log.i(TAG, Thread.currentThread().getName());
    //this.r
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        Log.i(TAG, Thread.currentThread().getName() + e.toString() );
    }
    setContentView(R.layout.main); //work OK
}

}

以下のコードを使用してクラスを離れた場合、問題はありません。「最初の」唯一のビューが表示されます。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash); //work OK

} }

4

2 に答える 2

4

pbは、ロゴ画面が表示される代わりに、黒い画面が表示されるだけです。

Thread.sleep()間違ったアプローチです。スプラッシュ画面を表示するなど、すべてが発生するのを防いでいます。

アクティビティのonCreate()がうまく機能しないのは、次のとおりです(5秒間の黒い画面と、UIが表示された後、例外はスローされません)

レイアウトはが呼び出された後に onResume()のみ表示されるため、UIスレッドをブロックすることによりonCreate()、空白の画面が作成されます。次に、スレッドが再開すると、両方のレイアウトが描画されますがsetContentView()、数ミリ秒後に次のレイアウトが呼び出されるため、スプラッシュ画面は表示されません。


スプラッシュ画面を使用するという考えには議論の余地がありますが、5秒後にコールバックを使用してレイアウトを変更する必要があります。画面を変更するには、ハンドラーとランナブルを使用します。

私の個人的な意見を挿入するために、ロードに5秒かかるアプリは拒否します。アプリを開くたびに2〜3秒間ロゴを見るよりも、やるべきことがあります。


私はρяσѕρєяKの答えが好きですが、悪魔の代弁者を演じます。ルートビューの組み込みハンドラーを使用することを好みます。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    findViewById(android.R.id.content).postDelayed(new Runnable() {
        @Override
        public void run() {
            setContentView(R.layout.main);
        }
    }, 1000);
}
于 2013-01-01T18:34:51.247 に答える
4

メインUIスレッドで待機させるために使用するTimerTask代わりに、次のように使用できます。Thread.sleep

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
        // use runOnUiThread for Updating Ui elements
        Your_Activity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                 // set Activity Next layout Here
                setContentView(R.layout.main);
            }
        });
    }
}, 5000);
于 2013-01-01T18:35:20.453 に答える