2012年12月10日月曜日

Activity起動時にタイトルバーが一瞬ちらつく件

例えば以下のようにActivity起動時(画面が表示される前)に若干時間がかかる
処理がある場合、なぜか一瞬だけタイトルバーが表示されてしまう。
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //
    // 若干時間のかかる処理(例えば0.5~1秒くらい)
    //

    setContentView(R.layout.main);
}
そこでタイトルバーがちらつかないようにする回避策を発見したので、
以下に手順を記載しておく。

(1)styles.xmlにダミー用の透過テーマを定義する。タイトルバーの影を抑止するため、android:windowContentOverlayに@nullを設定する。

    #00000000
    

(2)AndroidManifest.xmlに(1)で定義したテーマをランチャーActivityのテーマに設定する。

    
        
            
            
        
    

(3)ActivityのonCreate()でタイトルバーを非表示にした直後にsetContentView()を呼び出して、時間のかかる処理を実行した後にタイトルバーを表示する。また背景が透過状態なので背景色を設定したり、別のテーマを適用する。
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // タイトルバーの非表示
    ViewGroup viewGroup = (ViewGroup)findViewById(android.R.id.title).getParent();
    viewGroup.setVisibility(View.INVISIBLE);

    // ダミー用の透過レイアウトを設定
    setContentView(R.layout.main);

    //
    // 若干時間のかかる処理(例えば0.5~1秒くらい)
    //

    // タイトルバーの表示
    ViewGroup viewGroup = (ViewGroup)findViewById(android.R.id.title).getParent();
    viewGroup.setVisibility(View.VISIBLE);

    // 背景色の設定(例えば不透明)
    PaintDrawable paintDrawable = new PaintDrawable(Color.argb(255, 0, 0, 0));
    getWindow().setBackgroundDrawable(paintDrawable);
}
このようにすればActivity起動前のちらつきは抑止できる。
他にも色々試してみたが、結局うまくいかず上記の方法にたどり着いた。

もし他に良い方法があったら誰か教えてください。


【2013/2/1追記】
ActionBarの場合も同様に、setContentView()まで若干の処理時間がかかる場合に
ちらつく現象が発生する。この回避方法はまだ分かっていない。(下記リンクを参考)

■ Action Bar Compatで一瞬ラベルが表示されてしまう問題
http://d.hatena.ne.jp/yohpapa/20111229/1325146676

■ Android:ActionBarに一瞬表示されるタイトルを非表示にする方法
http://yuki312.blogspot.jp/2012/03/androidactionbar.html

0 件のコメント:

コメントを投稿