3

次のように宣言された 2 つの PreferenceScreen 内にネストされた RingtonePreference があります。

<PreferenceScreen
//other preferences
        <PreferenceScreen
        //other preferences
                <RingtonePreference
                    android:key="ringtone"
                    android:title="@string/ringtone_title"
                    android:summary="@string/sipringtone_ringtone_summary"
                    android:ringtoneType="ringtone"  />
        />
/>

PreferenceFragment は、ActivityGroup 内にネストされています。フラグメントへのパスは次のとおりです: MainActivity(TabActivity)->Activity1(ActivityGroup)->Activity2(Activity)->PreferenceFragment

私はこのコードを書きませんでしたが、誰かが中断したところから拾っています。Activity2 のコンテキストが気に入らなかったため、すべての設定をクリックすることによるダイアログがアプリをクラッシュさせていました。これは、各設定のコンテキストを Activity1 のコンテキストに強制することで解決された、ActivityGroup 関連の問題でした。

EditPreferences、ListPreferences、および CheckPreferences はすべて意図したとおりに機能しましたが、RingtonePreference が多くの問題を引き起こしています。着信音の選択を選択するためのダイアログが表示されますが、設定は保存されません。

リストから着信音を選択して [OK] ボタンを押しても、onPreferenceChange() または onSharedPreferenceChanged() はトリガーされません。カスタム RingtonePreference を作成して onSaveRingtone() をオーバーライドしようとしましたが、まったく呼び出されませんでした。ただし、onPrepareRingtonePickerIntent() や onRestoreRingtone() などの他のメソッドが呼び出されました。スタックオーバーフローで言及された他のオプションをたくさん試しましたが、うまくいきませんでした。RingtonePreference を機能させるためのアイデアが尽きたので、RingtoneManager を使用して独自の着信音ピッカーを開始するのが最善の方法だと思います。RingtonePreference を機能させる方法についてアドバイスをくれる人がいれば、それは素晴らしいことです。

編集:これはコンテキストの問題だと思いますが、まだ解決方法がわかりません。

4

2 に答える 2

0

kyrax の答えは適切に思えますが、プログラムで設定を作成し、そのように挿入するという混乱をすべて経験したくはありませんでした。

この問題を解決するために、完全な XML から始めて、OnPreferenceChangeListener を RingtonePreference に追加しました。これは、PreferenceFragment から実行できます。

    Preference notificationSoundPref = findPreference("ringtone);
    notificationSoundPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            // do what you need here
            return true;
        }
    });
于 2016-01-14T17:00:47.873 に答える
0

RingtonePreference を機能させることはできませんでしたが、いくつかの新しい詳細と代替手段を見つけました。RingtonePreference は、ダイアログの新しいアクティビティを開始するように見えます。launchmode=singleInstance がある場合、別のタスク スタックでそのアクティビティを開始しているため、RingtonePreference が台無しになります。launchmode=singleTask を使用するか、launchmode を削除すると問題が解決する可能性がありますが、私にとっては完全ではありません (ただし、launchmode が singleInstance と等しくならないようにする必要がありました)。私の解決策は、Java コードで設定を手動で追加することでした。手順は

1) Find your preference screen
2) Make a preference
3) Set your preference details, i.e. title & summary
4) (Optional) Arrange the order of your preference (google the setOrder function for preference)
5) Set the onPreferenceCLickerListener to the preference you created
6) Inside onPreferenceClick, Launch the ringtone picker dialog configured by RingtoneManager and start the activity from where ever you want.
7) Add the preference to your preference screen chosen in step 1.
8) On the activity/fragment where you started the ringtone picker, override on onActivityResult() and handle the chosen ringtone.

幸運を!

于 2014-07-31T18:18:37.217 に答える