8

私はAndroidでスイッチ設定を機能させようとしてきました。これにより、場合によっては、スイッチのオン/オフを切り替えるときと、設定全体をクリックするときで、インターセプトと処理を変えることができます。

これが私が達成しようとしていることです:ユーザーが設定に入るタグはオフでタグは保存されません(つまり、タグ設定は空です)ユーザーはタグの設定をオンにし、現在タグが保存されていないため、タグ検索アクティビティを開始しますユーザーがタグを見つけるために。- 正常に動作します。

タグがすでに存在し、状態のみが変更される場合は、通常どおり値を更新します。- 正常に動作します

私の問題は次のとおりです。設定をクリックし、すでにタグが保存されている場合は、状態を変更せずに(有効か無効かに関係なく)、タグ検索アクティビティを起動します。-これは機能しません。

これまでのところ、上記の最後のシナリオでは、onPreferenceChangedが呼び出され、続いてonPreferenceClickedが呼び出され、続いてonPreferenceChangedが呼び出されます。これが私の問題のようです。onPreferenceChangedを最初に呼び出すと、SharedPreferencesのリスナーが呼び出され、有効になったことを通知します。

onPreferenceChangedへの最初の呼び出しを受け取らなかった場合、問題は発生しません。

これが私がリスナーを設定している関連部分です

SwitchPreference tagPref = (SwitchPreference) findPreference(PreferencesConstants.PREFERENCE_TAG_ENABLED);
    tagPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            Log.e("BLAH", "onPrefChanged....is it handled by OnClick?" + Boolean.toString(handledByClick));


            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());

            boolean enabled = prefs.getBoolean(PreferencesConstants.PREFERENCE_TAG_ENABLED, false);
            Log.e("BLAH", "value stored in prefs? " + Boolean.toString(enabled));
            if (newValue instanceof Boolean) {
                enabled = (Boolean) newValue;
            }

            Log.e("BLAH", "New value? " + Boolean.toString(enabled));

            if (!handledByClick) {
                if (enabled && (currentTag == null || currentTag.isEmpty())) {
                    Log.e("BLAH", "Enabled and CurrentTag empty!");
                    Intent intent = new Intent(getActivity(), TagSearchActivity.class);
                    startActivityForResult(intent, 0);

                    return false; // always return false, we'll handle
                                    // updating
                                    // this value manually.
                } else {
                    return true;
                }
            }
            Log.e("BLAH", "returning false (AS IN WE HANDLED IT).");
            return false;
        }
    });

    tagPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {

        @Override
        public boolean onPreferenceClick(Preference preference) {

            handledByClick = true;
            Log.e("BLAH", "onprefClick");

            Intent intent = new Intent(getActivity(), TagSearchActivity.class);
            startActivityForResult(intent, 0);

            return true;
        }
    });

保存されたタグを使用して実行し、設定をクリックした後の関連するログ行は次のとおりです。

01-18 15:55:05.593: E/BLAH(13261): onPrefChanged....is it handled by OnClick?false
01-18 15:55:05.593: E/BLAH(13261): value stored in prefs? true
01-18 15:55:05.593: E/BLAH(13261): New value? false
01-18 15:55:05.613: E/DifferentClass(13261): On Shared Preferences Changed - tagEnabled
01-18 15:55:05.652: E/DifferentClass(13261): disabled TAG in cancelAlarmService
01-18 15:55:05.662: E/AnotherClass(13261): Updating Feed List.  Old Size: 33, New Size: 14
01-18 15:55:05.682: E/BLAH(13261): onprefClick
01-18 15:55:05.812: E/BLAH(13261): onPrefChanged....is it handled by OnClick?true
01-18 15:55:05.812: E/BLAH(13261): value stored in prefs? false
01-18 15:55:05.822: E/BLAH(13261): New value? false
01-18 15:55:05.822: E/BLAH(13261): returning false (AS IN WE HANDLED IT).
4

3 に答える 3

2

さらに何時間も検索した後、この状況で他の人に役立ついくつかの投稿に出くわしました.

これは、私の問題を考慮して選択したソリューションでした: EditTextPreference と Togglebutton を使用して 1 つの Preference を作成するにはどうすればよいですか?

これは非常に詳細な回答であり、好みを理解するのに非常に役立ちます。

私が遭遇した他の投稿はこれでした: http://xgouchet.fr/android/index.php?article4/master-on-off-preferences-with-ice-cream-sandwich

上記のものとほぼ同じルックアンドフィールが得られますが、より多くの作業が必要であり、私の要件のために機能しません。

于 2013-01-22T21:26:31.247 に答える
1

存在しない機能について質問していると思います。

ただし、プリファレンス アクティビティは listView を使用するため、いくつかのトリックを使用してそれをカスタマイズし、必要に応じて処理することができます。

これは、このWebサイトに基づいて、カスタマイズについて作成した投稿です。私が尋ねたのは listView を追加する方法ですが、設定アクティビティが実際に listview を使用していることを知りませんでした。

于 2013-01-18T22:06:38.977 に答える