4

私が気付いたのは、ヘッダー付きのPreferenceActivityがある場合に4.xを実行しているスマートフォンでは、OSは最初にヘッダーを含むアクティビティを作成します。ユーザーがヘッダーリストから1つのアイテムをクリックすると、そのエントリのPreferenceFragmentを表す別のアクティビティが作成されます。タブレットでは、ヘッダーリストとこのフラグメントは同じアクティビティに属し、画面に同時に表示されます。

だから、問題はこれです。ユーザーがPreferenceFragmentにいて、そこで設定を変更したときに、対応するヘッダーの要約を更新したいと思います。onBuildHeaders()呼び出しからのheadersオブジェクトへの参照があります。

@Override
public void onBuildHeaders(List<Header> aTarget) {
    ...
    headers = aTarget;
}

ここで、ヘッダーを更新するために、このリストをループしてIDを確認します。

private void setHeaderSummary(int id, String summary) {
    for (Header header : headers) {
        if (header.id == id) {
            header.summary = summary;
            invalidateHeaders();
            return;
        }
    }
}

これはタブレットでは完璧に機能しますが、スマートフォンでは効果がありません。ユーザーがPreferenceFragmentから最初のPreferenceActivityに戻ると([戻る]ボタンを押すことにより)、ヘッダーは変更されません。

4

1 に答える 1

3

質問を入力しながら解決策を見つけました。invalidateHeaders()は、2番目のアクティビティ(PrefenceFragmentを含むアクティビティ)で呼び出されます。最初のアクティビティ(ヘッダーを含むアクティビティ)で呼び出す必要があります。これは最も美しい解決策ではありませんが、親アクティビティへの参照を保持し、設定が変更された場合はonResume()ヘッダーを無効にします。

于 2012-11-23T12:59:27.347 に答える