リストの設定のほとんどがコードを実行し、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;
}
});
次に、実際にクリックイベントからの応答を取得します。唯一の欠点は、設定グループを削除する必要があることです。なぜこれが原因で、それを修正する方法を知っている人はいますか?
私は自分の(本当に混乱していると信じている)解決策を思いつきました。しかし、それは機能します。
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を設定しました。厄介ですが、ようやく動作します。
OnPreferenceClickListener
を実装し、onPreferenceClick
に
@Override
public boolean onPreferenceClick (Preference preference)
{
String key = preference.getKey();
// do what ever you want with this key
}
多分、これは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で呼び出す必要がないことです。
これが誰かに役立つことを願っています!
オーバーライドするだけです:
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
String key = preference.getKey();
...
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
また、設定を見つけてクリックリスナーを設定することもできます。
Preference connectToNewComputer= findPreference("connectToNewComputer");
connectToNewComputer.setOnPreferenceClickListener(this);
他の回答は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
}
}
次のものがある場合(プロジェクトからのコピー貼り付け)、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);
}
}
.....
}