2012-03-12 8 views
4

のテーマを変更するだから私は現在、はsingleTop活動

android:launchMode="singleTop" 

としてマークされている私のアプリでの活動を持っている...と私は現在、両方ののonCreate onNewIntentへのロジックを持っています起動した最新のインテントによって配信されたデータが画面に常に表示されていることを確認してください。そして、私はHolo.LightとHoloの間で変更することができるようにしたいと思います。その意図によって提供されたデータに基づいて。

setThemeを呼び出すと、(これら2つのリンクを参照)は動作しません:

第2のリンクは第二のAndroidManifest.xmlを作成する必要の回避策を持っていること他のテーマを持ち、問題のアクティビティの空のサブクラスを指すエントリ。これは動作しますが、singleTopが壊れています(スタック上に2つのアクティビティインスタンスが存在する可能性があるため)。

私はアイデアの出です。このアクティビティの独自のカスタムActionBarビューをロールオーバーする以外に、これを行う方法があるかどうかは誰にでも分かりますか?

答えて

1

setTheme()メソッドを使用してテーマを設定してから、アクティビティをリロードする必要があります。

私はsingleTask活性を有し、そしてAPI < 11上で実行されるコード、私は活動をリロードするには、このコードを持っている:

public void reload() { 
    Intent intent = getIntent(); 
    overridePendingTransition(0, 0); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
    finish(); 

    overridePendingTransition(0, 0); 
    startActivity(intent); 
} 

私はかなりちょうど活動を終えて、再びそれを呼んでいます。私はリロードの外観を瞬時にするためにトランジションアニメーションを無効にします。

+0

このようなサウンドはうまくいくはずです。ありがとう! – Eric

+1

これを試している他の人にとって、私はメソッドの3行目をintent.setFlagsに変更しなければなりませんでした。問題のインテントにIntent.FLAG_ACTIVITY_REORDER_TO_FRONTフラグが設定されているため、再起動に失敗していました。 – Eric

1

ホロのテーマを参照しているので、私はAPI 11以上で作業していると思います。

API 11は、画面を横向きと縦向きの間で回転させるなど、設定の変更で通常発生する同じティアダウン/再作成プロセスで現在のアクティビティを送信するActivity#recreate()メソッドを追加しました。新しいActivityインスタンスに対してonCreateメソッドが再度呼び出され、ウィンドウが通常通りに初期化される前にアクティビティのテーマを設定できます。

Googleブックスのアプリでは、この方法を使用して、「夜間モード」の明暗のテーマを切り替えることができます。

+0

申し訳ありませんが、actionbarsherlockタグは、これが最新かつ最高のもの以上のもので動作する必要があることを示していたと思われます。 – Eric

+1

しかし、サポートしているデバイスでは、旧バージョンのOSを終了して新しいアクティビティを開始し、このアクティビティを使用することができます(APIの一部である方がよい)。 –

0

ここでは何も新たに追加するのではなく、さまざまなヒントを併合して解決策を投稿します。

、必要に応じて活動のテーマを変更した後、アプリケーションの(あなたが探しているものに依存します):

public void updateTheme(Activity a, int themeID) { 
    a.getApplication().setTheme(themeID); 
    a.setTheme(themeID); 
} 

はその後、(単に設定変更後など)の活動を再作成する必要があります。 OS 11の場合、APIがありますが、以前のバージョンでは代わりにUdinicと指摘されているように、アクティビティを強制終了して再起動する必要があります。

public boolean isBeforeHoneycomb() { 
    return Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB; 
} 

public void reload() { 
    if(isBeforeHoneycomb()) { 
     Intent intent = getIntent(); 
     overridePendingTransition(0, 0); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
     finish(); 

     overridePendingTransition(0, 0); 
     startActivity(intent); 
    }else{ 
     recreate(); 
    } 
}