web-dev-qa-db-ja.com

設定クリックリスナーの設定アクティビティ

リストの設定のほとんどがコードを実行し、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つがクリックされたときにコードのブロックを実行することです。 Google Play設定の設定メニューの「検索履歴をクリア」に似ています。 ( 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;
        }
    });

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

17
BarryBostwick

私は自分の(本当に混乱していると信じている)解決策を思いつきました。しかし、それは機能します。

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を設定できないことでした。そのため、各Preferenceに到達する2つのforループを作成し、それぞれにOnPreferenceClickListenerを設定しました。厄介ですが、ようやく動作します。

8
BarryBostwick

OnPreferenceClickListenerを実装し、onPreferenceClick

@Override
public boolean onPreferenceClick (Preference preference)
{
    String key = preference.getKey();
    // do what ever you want with this key
}
15
Hoan Nguyen

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

Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);

次に、クリックリスナーを追加して、そのon clickメソッドを

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-else if -...構成のスイッチをコピーできます。主な利点は、各設定を見つける必要がなく、その設定をsetOnPreferenceClickListenerで呼び出す必要がないことです。

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

14
bd95

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

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

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

    return super.onPreferenceTreeClick(preferenceScreen, preference);
}
10
marmor

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

Preference connectToNewComputer= findPreference("connectToNewComputer");
connectToNewComputer.setOnPreferenceClickListener(this);
10
Apirak Lunla

2020年2月のAndroidxの場合

他の回答はAndroidxでは機能しませんでした。 Android Developers ガイドから設定を実装しました

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

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    
        }
}
1
majuran

次のものがある場合(プロジェクトからのコピー貼り付け)、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);
    }
}

.....

}
0
CodeToLife