153

3.0デバイスと3.0より前のデバイスの両方に適用できる設定を作成したいと考えています。非推奨のメソッドが含まれていることを発見しPreferenceActivity(これらは付属のサンプルコードで使用されていますが)、PreferenceFragement問題を解決するための互換性パッケージを調べました。

ただし、PreferenceFragment互換性パッケージには含まれていないようです。これが意図的なものかどうか誰かに教えてもらえますか?もしそうなら、私は簡単にさまざまなデバイス(つまり<3.0および> = 3.0)をターゲットにすることができますか、それともフープを飛び越える必要がありますか?意図的に除外されていない場合、互換性パッケージの新しいリリースを期待できますか?または、安全に使用できる別の回避策はありますか?

乾杯

ジェームズ

4

8 に答える 8

90

PreferenceActivityに非推奨のメソッドが含まれていることを検出します(ただし、これらは付属のサンプルコードで使用されています)

非推奨のメソッドは、Android3.0で非推奨になりました。これらはAndroidのすべてのバージョンで完全に問題ありませんが、PreferenceFragmentAndroid3.0以降で使用することをお勧めします。

これが意図的なものかどうか誰かに教えてもらえますか?

私の推測では、それはエンジニアリング時間の問題ですが、それは単なる推測です。

もしそうなら、私は簡単にさまざまなデバイス(つまり<3.0および> = 3.0)をターゲットにすることができますか、それともフープを飛び越える必要がありますか?

「簡単に」できると思います。2つの別々のPreferenceActivity実装があります。1つは設定ヘッダーを使用し、もう1つPreferenceFragmentsは元のアプローチを使用します。必要な時点で適切なものを選択します(たとえば、ユーザーがオプションメニュー項目をクリックしたとき)。これを示すサンプルプロジェクトを次に示します。または、このサンプルプロジェクトPreferenceActivityのように、両方のケースを処理するシングルを用意します。

意図的に除外されていない場合、互換性パッケージの新しいリリースを期待できますか?

あなたは私たちの残りがいつそれが出荷されるか、つまりいつ出荷されるかを知るでしょう。

または、安全に使用できる別の回避策はありますか?

上記を参照。

于 2011-03-31T14:41:45.353 に答える
21

@CommonsWare からの回答の微妙な意味は、アプリは互換性 API または組み込みフラグメント API (SDK 11 以降) のどちらかを選択する必要があるということです。実際、それが「簡単に」推奨されたことです。つまり、PreferenceFragment を使用する場合、アプリは組み込みフラグメント API を使用し、PreferenceActivity で非推奨のメソッドを処理する必要があります。逆に、アプリが互換性を使用することが重要な場合。PreferenceFragment クラスがまったくないことに直面する API。したがって、デバイスをターゲットにすることは問題ではありませんが、いずれかの API を選択する必要があり、予期しない回避策に設計を提出する必要がある場合は、フープジャンプが発生します。コンパットが必要です。API を使用しているので、独自の PreferenceFragment クラスを作成して、その動作を確認します。最悪のシナリオで私は

編集: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/preference/PreferenceFragment.javaでコードを試してみた後? av=h -- 独自の PreferenceFragment を作成することはできません。「保護」の代わりにPreferenceManagerでpackage-privateを自由に使用することが主なブロッカーであるようです。それを行うためのセキュリティや本当に良い動機があるようには見えません。単体テストには適していませんが、まあ...タイピングが少ないと思います...

EDIT v2: 実際にそれが起こり、うまくいきました。互換性 API JAR でコードを機能させることは、間違いなく頭痛の種でした。com.android.preference パッケージの約 70% を SDK から自分のアプリにコピーしてから、通常は平凡な品質の Java コードを Android で処理する必要がありました。SDKのv14を使用しました。Android の主任エンジニアがこのトピックについて何人か言っているのを聞いたのとは反対に、Google のエンジニアが私がしたことをする方がはるかに簡単だったでしょう。

ところで、「デバイスをターゲットにすることは問題ではない」と言ったでしょうか。完全に... com.android.preference を使用する場合、大幅なリファクタリングなしでは互換性 API と交換することはできません。楽しいログ!

于 2012-01-11T09:51:43.780 に答える
16

CommonsWare の回答と Tenacious の観察に基づいて、コードやリソースの重複を最小限に抑え、現在のすべての Android API バージョンをターゲットにできる単一の子孫クラス ソリューションを考え出しました。ここで関連する質問に対する私の回答を参照してください: PreferenceActivity Android 4.0 以前

または私のブログ: http://www.blackmoonit.com/2012/07/all_api_prefsactivity/

4.0.3 と 4.0.4 を実行する 2 台のタブレット、4.0.4 と 2.3.3 を実行する電話、および 1.6 を実行するエミュレータでテスト済みです。

于 2012-07-04T22:52:39.927 に答える
10

2015 年 8 月、Google は新しいPreference Support Library v7をリリースしました。

これで、PreferenceFragmentCompatを anyActivityまたはAppCompatActivity

public static class PrefsFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
}

preferenceThemeテーマに設定する必要があります:

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  ...
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

preferenceThemeこのようにして、アクティビティの他の部分に影響を与えることなく、各設定タイプに使用されるレイアウトをスタイルするようにカスタマイズできます。

于 2015-09-01T06:49:28.253 に答える
7

テネイシャスの答えは正しいですが、ここにいくつかの詳細があります。

「通常のレイアウトを作成し、view コンポーネントを手動で sharedprefs にバインドする」ことができない理由は、android.preferences API にいくつかの驚くべき省略があるためです。PreferenceActivity と PreferenceFragment はどちらも、重要な非公開の PreferenceManager メソッドにアクセスできます。これがないと、独自の設定 UI を実装できません。

特に、XML ファイルから Preference 階層を構築するには、PreferenceManager を使用する必要がありますが、PreferenceManager のコンストラクターはすべてパッケージ プライベートまたは非表示のいずれかです。Preference onClick リスナーをアクティビティにアタッチする方法もパッケージ プライベートです。

また、Android API の非パブリック メソッドは実際には SDK から省略されているため、こっそりと android.preferences パッケージに実装を配置しても、これを回避することはできません。リフレクションと動的プロキシを含む少しの創造性があれば、それらを実現することができます。Tenacious が言うように、唯一の代替手段は、少なくとも 15 個のクラス、5 個のレイアウト、および同数の style.xml 要素と attrs.xml 要素を含む android.preference パッケージ全体をフォークすることです。

元の質問に答えると、Google が互換性パッケージに PreferenceFragment を含めなかった理由は、Google が Tenacious や私とまったく同じ問題を抱えていたからです。Google でさえ、時間をさかのぼって古いプラットフォームでこれらのメソッドを公開することはできません (ただし、将来のリリースではそうしてくれることを願っています)。

于 2013-05-01T12:34:07.983 に答える
2

環境設定をアプリケーションの設計に統合し、2.3 android のサポートを維持する必要がありました。だから私はまだPreferencesFragmentが必要でした。

いくつかの検索の後、android-support-v4-preferencefragment lib を見つけました。Tenaciousが言ったように、このlibは元のPreferencesFragmentをコピーしてリファクタリングする時間を大幅に節約します。正常に動作し、ユーザーは好みを楽しんでいます。

于 2014-02-20T15:09:47.647 に答える