Non Deprecated findPreference() Method? - Android
Solution 1
Is there a non deprecated equivalent?
If you are using PreferenceFragment
on API Level 11+ devices, you would call findPreference()
on it. Otherwise, call findPreference()
on your PreferenceActivity
, as you have no choice.
If not, what if I use it anyway?
It will work.
How can Fragments help me do my task in a better way?
API Level 11+ introduced PreferenceFragment
as another way of constructing the contents of a PreferenceActivity
. You are welcome to use them, but if you are still supporting older devices, you cannot use PreferenceFragment
for those devices.
That being said:
I want to detect when a Preference contained in a ListView gets clicked, so that I can launch an intent to manage that selection.
You do not need Java code for this. Use:
<PreferenceScreen
android:title="@string/title_intent_preference"
android:summary="@string/summary_intent_preference">
<intent android:action="android.intent.action.VIEW"
android:data="http://www.android.com" />
</PreferenceScreen>
(as seen in the JavaDocs for PreferenceActivity
)
This will create an entry in the preference UI that, when clicked, will start an activity with the specified Intent
.
Solution 2
If you use fragments, you can use the method "findPreference()" on the basis of a preferences fragment.
public class CustomActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom);
CustomFragment customFragment = (CustomFragment) getFragmentManager().findFragmentById(R.id.custom_fragment);
EditTextPreference textPreference = (EditTextPreference) customFragment.findPreference("preference_key");
textPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
//open browser or intent here
}
});
}
}
Solution 3
2018 UPDATE
Today, the onPreferenceTreeClick
method has to be overriden in the Preference fragment for this purpose. For example:
public class MySettingsFragment extends PreferenceFragment {
@Override
public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen,
Preference preference)
{
String key = preference.getKey();
if(key.equals("someKey")){
// do your work
return true;
}
return false;
}
}
Solution 4
maybe docs link are not clear. But using that feature is very simple. for example, you can use that as a twitter page like this
<PreferenceCategory android:title="Share" >
<PreferenceScreen
android:title="Twitter"
android:summary="Follow me at Twitter">
<intent android:action="android.intent.action.VIEW"
android:data="https://twitter.com/" />
</PreferenceScreen>
</PreferenceCategory>
it doesnt need any java code. Thanks to CommonsWare!
Comments
-
Matteo over 3 years
I want to detect when a
Preference
contained in aListView
gets clicked, so that I can launch an intent to manage that selection.I would have done like this in my layout
XML
file:<Preference android:title="About" android:key="myKey"></Preference>
And the following in my
java
code:Preference myPref = (Preference) findPreference("myKey"); myPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { //open browser or intent here } });
But the method
public Preference findPreference (CharSequence key)
is deprecated.- Is there a non deprecated equivalent?
- If not, what if I use it anyway?
- How can
Fragments
help me do my task in a better way?Chek here: Preferences without deprecated methods.
Here you can check the
XML
layout structure that my activity has, and a snapshot of the application:XML:
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <Preference android:key="about" android:title="@string/titleAbout" android:summary="@string/summaryAbout" /> <Preference android:key="labelTaxonomy" android:title="@string/titleLabelTaxonomy" android:summary="@string/summaryLabelTaxonomy" /> </PreferenceScreen>
SNAPSHOT:
After clicking on the About (or Access Label Taxonomy)
Preference
, I'd like to open anintent
of some kind (could also be a video or anything else...the names are misleading). -
Matteo almost 12 yearsThks a lot, just two other questions: 1) I have many preferences entries <Preference> inside of my <PreferenceScreen>, can I still use the
XML
approach you are suggesting in the snippet just for one singlePreference
entry?and how? 2) Suppose I want to use a newintent
, I'm forced to used some java code to create it, correct? I hope you can help me, Thks again! ;D -
CommonsWare almost 12 years@Matteo: 1) Read the JavaDocs that I linked to, and see the example of the use of this
<intent>
approach in and among other preferences. 2) I have no idea what "a newintent
" means in this case. -
Matteo almost 12 years1) Thks... 2) Let me explain better: it seemed to me that the intent described in your
XML
snippet is only for visiting a website by opening the browser. Suppose I want to launch an intent opening another activity, or displaying a video from the gallery of the phone, or anything else, I should define the new intent in the standard Java way, correct? -
CommonsWare almost 12 years@Matteo: IMHO, preferences should not be leading to random places. Preferences are for preferences, not for displaying videos. The purpose of
<intent>
is if you have something that logically is part of the app's settings but cannot readily be rendered using the standard preference UI. That being said, if yourIntent
is not static, you will need to handle it via Java, probably using code along the lines of what you have in your question. -
Matteo almost 12 yearsI c...!So I should not use
Preferences
in the way I'm doing?(You can check the added part of the question)...If not what kind of class should I use instead?Thks so much for you help, and sorry if it's a stupid question, I'm a beginner in android... ;D -
CommonsWare almost 12 years@Matteo: I would just have "About" be in your options menu or the overflow menu of the action bar.
-
Matteo almost 12 yearsAnd what class should I use instead for the other entries? a
ListActivity
? -
CommonsWare almost 12 years@Matteo: Since I don't know what "Access Label Taxonomy" is supposed to do, I cannot answer that question, sorry.
-
Matteo almost 12 yearsIt should launch an intent visualising a video, or opening the browser, or anything like that. Thks for your help, really!
-
trans almost 8 yearsSo what is the
R.id.custom_fragment
? I am trying to get the preference from within my custom fragment and can't figure it. -
kaffee_kocher almost 8 yearsThe
R.id.custom_fragment
is the id of your defined fragment. For example:<fragment android:id="@+id/custom_fragment" android:name="com.example.CustomFragment"/>
-
sonichy about 3 yearsDeprecated in API 15