49

我想检测 aPreference中包含的 a何时ListView被点击,以便我可以启动一个意图来管理该选择。

我会在我的布局XML文件中这样做:

<Preference android:title="About" android:key="myKey"></Preference>

我的java代码中包含以下内容:

Preference myPref = (Preference) findPreference("myKey");
myPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
             public boolean onPreferenceClick(Preference preference) {
                 //open browser or intent here
             }
         });

但该方法public Preference findPreference (CharSequence key)已被弃用。

  1. 是否有未弃用的等价物?
  2. 如果没有,如果我仍然使用它怎么办?
  3. 如何Fragments帮助我以更好的方式完成我的任务?在这里检查:不推荐使用方法的首选项

在这里您可以检查XML我的活动具有的布局结构,以及应用程序的快照:

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>

快照:

快照

单击 About(或 Access Label Taxonomy)Preference后,我想打开intent某种类型的(也可能是视频或其他任何内容……名称具有误导性)。

4

4 回答 4

63

是否有未弃用的等价物?

如果你PreferenceFragment在 API Level 11+ 设备上使用,你会调用findPreference()它。否则,请致电findPreference()您的PreferenceActivity,因为您别无选择。

如果没有,如果我仍然使用它怎么办?

它会起作用的。

Fragments 如何帮助我以更好的方式完成任务?

API 级别 11+PreferenceFragment作为构建PreferenceActivity. 欢迎您使用它们,但如果您仍然支持旧设备,则不能PreferenceFragment用于这些设备。

话虽如此:

我想检测何时单击 ListView 中包含的首选项,以便我可以启动管理该选择的意图。

为此,您不需要 Java 代码。利用:

    <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>

(如JavaDocs 中PreferenceActivity所见)

这将在首选项 UI 中创建一个条目,单击该条目时,将使用指定的Intent.

于 2012-06-30T11:46:58.627 回答
5

如果您使用片段,则可以在首选项片段的基础上使用方法“findPreference()”。

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
         }
     });
  }
}
于 2015-04-11T13:14:55.003 回答
2

2018 更新 今天,onPreferenceTreeClick为此必须在 Preference 片段中覆盖该方法。例如:

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;
    }
}
于 2018-10-22T16:47:14.007 回答
1

也许文档链接不清楚。但是使用该功能非常简单。例如,您可以将其用作这样的 twitter 页面

<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>

它不需要任何java代码。感谢CommonsWare!

于 2014-04-15T10:48:03.690 回答