2016-05-15 9 views
4

AppCompatDelegate.MODE_NIGHT_AUTOは既存のアクティビティを更新していないため、その理由がわかりません。AppCompat MODE_NIGHT_AUTOが動作しません。

ダイナミックに夜間モードを変更できるようにしました。ユーザーがautoにモードを変更した場合、私は、デフォルトのナイトモードを設定し、その後の活動を再作成します。私はMODE_NIGHT_YESまたはMODE_NIGHT_NOに変更

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO); 
recreate(); 

場合、期待どおり、それが動作します。 MODE_NIGHT_AUTOに変更すると、正しいダーク/ライトテーマに移動しますが、昼間から夜間に移行した後はアクティビティを更新できません。私は日の出/日の出を待たなければならないので、これをテストするのはうんざりです(編集:場所の許可が使用されない限り、私は手動でデバイスの時刻を変更することができます。

onresumeのナイトモードフラグを手動でチェックして、既存のアクティビティのリソースを手動で更新する必要がありますか、何か間違っていますか?私がデバイスを回転させ、日没後にアクティビティが再作成されると、ダークテーマは正しくピックアップされますが、回転する前にはまだライトのテーマが表示されます。

サポートlib 23.4.0、Androidバージョン6.0。

+0

バグだと思われるかもしれません。昼から夜(または他の方法)の切り替えが自動的に活動を再現するような構成変更を引き起こすと予想するのは無理ではありません。少なくともそれを選ぶのはいいことでしょう。 AOSPバグトラッカーで報告する価値はあると思います。 –

答えて

1

誰が私は(それはしかし、それを行うための正しい方法であるかどうかわからない)、これを解決するために何をしたかを知りたい場合は:

private int mCurrentNightMode; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    mCurrentNightMode = getCurrentNightMode(); 
} 

@Override 
protected void onPostResume() { 
    super.onPostResume(); 

    if (hasNightModeChanged()) { 
     delayedRecreate(); 
    } 

} 

private void delayedRecreate() { 
    Handler handler = new Handler(); 
    handler.postDelayed(this::recreate, 1); 
} 

private boolean hasNightModeChanged() { 
    getDelegate().applyDayNight(); 
    return mCurrentNightMode != getCurrentNightMode(); 
} 

private int getCurrentNightMode() { 
    return getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; 
} 
+0

なぜ 'recreate()'の呼び出しを遅らせなければならないのですか? –

+1

@MarcinKoziński - resume/postresumeでクラッシュすることなくrecreate()を呼び出すことはできません(正確な例外は思い出せません)。 – timothyjc

+0

このソリューションをありがとうございます。これまでのところ、私はrecreate()を遅らせるためのクラッシュやネーミングは見ていません。 –

1

それはAPPCOMPAT 24.2.0で修正されています。 Revision historyリスト24.2.0のための「行動変容」として、この:

あなたはAPPCOMPATライブラリの昼/夜機能を使用する場合はいつでも昼/夜モード 変化(いずれかの理由は、システム が自動的にあなたの活動を再現または AppCompatDelegate.setLocalNightMode()への呼び出しのために発生する可能性があります。

+0

乾杯!私もそれに気づいた:) – timothyjc

+0

これは現在のアクティビティで機能する。しかし、活動に戻っても何も再現されません。新しい断片を作成するViewPagerのようなものがあれば、突然昼と夜を混ぜ合わせます。 https://stackoverflow.com/a/37631109/467650私のためにこれを解決しました。 –

関連する問題