20

リスト内のほとんどの設定がコードを実行し、SharedPreferenceを直接変更しない設定アクティビティを構築しています。私のpreferences.xmlファイルは次のようになります。

<PreferenceCategory
    android:title="Connection" >

    <Preference
        android:id="@+id/settings_connectToNewComputer"
        android:key="connectToNewComputer"
        android:summary="Currently connected to:"
        android:title="Connect to new computer" />

    <Preference
        android:id="@+id/removeDevice"
        android:key="removeDevice"
        android:summary="Remove this device from the computer's whitelist"
        android:title="Remove this device from computer" />

</PreferenceCategory>

<PreferenceCategory
    android:title="About" >

    <Preference
        android:id="@+id/settings_About"
        android:key="about"
        android:summary="About me and my thanks to those who made this app great"
        android:title="About Hue Pro" />

    <Preference
        android:id="@+id/contact"
        android:key="contact"
        android:summary="Contact me with comments, bugs, and suggestions for updates"
        android:title="Contact me" />

</PreferenceCategory>

私の目標は、これらの設定の1つがクリックされたときにコードのブロックを実行することです。GooglePlayの設定設定メニューの「検索履歴のクリア」と同様です。(http://i.imgur.com/qnHbJX9.png

誰かがこれを可能にする方法を知っていますか?

findPreference( "KeyNameHere")を使用してみたことを追加する必要がありますが、常にnullが返されます。

ありがとうございました!


編集:

このコードを追加して、OnPreferenceClickListenerを実装しました。

@Override
public boolean onPreferenceClick(Preference preference) {
    return false;
}

ただし、このメソッドが呼び出されることはありません。これを行う別の方法はありますか?


編集2:

PreferenceCategoryタグを削除すると、次のようになります。

<Preference
    android:id="@+id/settings_connectToNewComputer"
    android:key="connectToNewComputer"
    android:summary="Currently connected to:"
    android:title="Connect to new computer" />

<Preference
    android:id="@+id/removeDevice"
    android:key="removeDevice"
    android:summary="Remove this device from the computer's whitelist"
    android:title="Remove this device from computer" />

<Preference
    android:id="@+id/settings_About"
    android:key="about"
    android:summary="About me and my thanks to those who made this app great"
    android:title="About Hue Pro" />

<Preference
    android:id="@+id/contact"
    android:key="contact"
    android:summary="Contact me with comments, bugs, and suggestions for updates"
    android:title="Contact me" />

そしてこれを呼びます:

getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

        @Override
        public boolean onPreferenceClick(Preference preference) {
            return false;
        }
    });

次に、クリックイベントから実際に応答を受け取ります。唯一の欠点は、設定のグループ化を削除する必要があることです。なぜこれがなぜであり、それを修正する方法を知っている人はいますか?

4

7 に答える 7

17

実装OnPreferenceClickListenerし、onPreferenceClick

@Override
public boolean onPreferenceClick (Preference preference)
{
    String key = preference.getKey();
    // do what ever you want with this key
}
于 2013-03-21T00:01:19.093 に答える
16

たぶん、これはOPには役に立たないかもしれませんが、他の誰かには役立つかもしれません。ある種の要約を書きたいと思います。一般に、主に3つの方法に従うことができます。1)コードのどこかで好みを見つけることができます。

Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);

次に、クリックリスナーを追加し、そのonclickメソッドを次のようにオーバーライドできます。

examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
        // handle click here
    }
});

これは、クリックを聞きたいすべてのプリファレンスに対して実行する必要があります。2)スイッチコンストラクトまたはif-else if-else ifを使用して、設定フラグメント/アクティビティにPreference.OnPreferenceClickListenerインターフェイスを実装し、onPreferenceClickを1回だけオーバーライドできます。 -...すべての単一処理を構築およびマージします。次のようになります。

@Override
public boolean onPreferenceClick(Preference preference) {
    switch (preference.getKey()) {
        case KEY_EXAMPLE_PREFERENCE: {
            // handle click here
        }
        break;
        case ...
    }
}

次に、あなたはまだそれぞれの好みを見つける必要がありますが、あなたは単にそれらのそれぞれを呼び出すことができます

setOnPreferenceClickListener(this);

(この最後の部分のため、OPの実装は機能しなかったと思います(彼のメソッドは呼び出されませんでした))クリックリスナーインターフェイスを実装したため、パラメーターとして「this」を渡します

3)(これが最も簡単だと思います)オーバーライドできます

onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)

他のインターフェースを実装せずに好みのフラグメント/アクティビティで、オプション2のif-elseif-...コンストラクトのスイッチをコピーできます。それぞれの設定を見つけてsetOnPreferenceClickListenerを呼び出す必要がないという主な利点。

これが誰かに役立つことを願っています!

于 2014-07-17T16:02:18.890 に答える
13

オーバーライドするだけです:

@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {

    String key = preference.getKey();
    ...

    return super.onPreferenceTreeClick(preferenceScreen, preference);
}
于 2014-10-28T12:46:13.913 に答える
10

設定を見つけてクリックリスナーを設定することもできます。

Preference connectToNewComputer= findPreference("connectToNewComputer");
connectToNewComputer.setOnPreferenceClickListener(this);
于 2013-10-03T19:42:22.810 に答える
8

私は自分自身の(私が信じていることは本当にめちゃくちゃになっている)解決策を思いついた。しかし、それは機能します。

for(int x = 0; x < getPreferenceScreen().getPreferenceCount(); x++){
        PreferenceCategory lol = (PreferenceCategory) getPreferenceScreen().getPreference(x);
        for(int y = 0; y < lol.getPreferenceCount(); y++){
            Preference pref = lol.getPreference(y);
            pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener(){

                @Override
                public boolean onPreferenceClick(Preference preference) {
                    return false;
                }

            });
        }
    }

したがって、私が学んだことは、次のように機能する階層システムがあるということです。XMLファイルでわかるように、PreferenceScreenには子PreferenceCategoryには子Preferenceがあります。私の問題は、PreferenceScreenから直接プリファレンスのonClickListenersを設定できないことでした。そこで、各プリファレンスに到達する2つのforループを作成し、それらのすべてにOnPreferenceClickListenerを設定しました。散らかっていますが、ようやく動作します。

于 2013-03-21T03:31:45.697 に答える
7

2020年2月のAndroidxの場合

他の回答は私にとってAndroidxでは機能しませんでした。Android開発者ガイドから設定を実装しました

クリックリスナーの実装については、以下のガイドを参照してください

1)以下のコードのように、設定フラグメントにPreferenceManager.OnPreferenceTreeClickListenerを実装します

import androidx.preference.PreferenceManager;

class SettingsFragment extends PreferenceFragmentCompat implements PreferenceManager.OnPreferenceTreeClickListener {

2)SettingsFragment内のonPreferenceTreeClickをオーバーライドします

@Override
public boolean onPreferenceTreeClick(Preference preference) {        
    String key = preference.getKey();

        switch (key) {
            case "key1":
                return true;

            case "key2":
                return true;

            //codes    
        }
}
于 2020-02-01T17:20:38.990 に答える
0

次のもの(プロジェクトからのコピーペースト)が見つかった場合、Preferenceオブジェクトはnullになりません。

public class ImePreferences extends PreferenceActivity {

....。

@Override
protected boolean isValidFragment(String fragmentName) {
    return Settings.class.getName().equals(fragmentName);
}

....。

public static class Settings extends InputMethodSettingsFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setInputMethodSettingsCategoryTitle(R.string.language_selection_title);
        setSubtypeEnablerTitle(R.string.select_language);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.ime_preferences);
        Preference pLcl = getPreferenceScreen().findPreference(getResources().getString(
                R.string.dictionary_button));
        pLcl.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                // handle click here
                l.a("this is the click");
                return true;
            }
        });
        if(pLcl != null)
            l.a(6576);
    }
}

....。

}
于 2015-08-23T23:58:12.537 に答える