Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Non Deprecated findPreference() Method? - Android

I want to detect when a Preference contained in a ListView 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.

  1. Is there a non deprecated equivalent?
  2. If not, what if I use it anyway?
  3. 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:

snapshopt

After clicking on the About (or Access Label Taxonomy) Preference, I'd like to open an intent of some kind (could also be a video or anything else...the names are misleading).

like image 274
Matteo Avatar asked Jun 30 '12 08:06

Matteo


2 Answers

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          }      });   } } 
like image 22
kaffee_kocher Avatar answered Sep 27 '22 18:09

kaffee_kocher


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.

like image 50
CommonsWare Avatar answered Sep 27 '22 20:09

CommonsWare