非已弃用的findPreference()方法?- Android

49

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

我会在我的布局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如何帮助我更好地完成任务?在此处查看:Preferences without deprecated methods

在这里,您可以检查我的活动所具有的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>

快照:

snapshopt

点击关于(或访问标签分类)的首选项后,我想打开某种意图(也可以是视频或其他任何东西...名称有误导性)。


我有一个类似于你的问题。在首选项中,我做了很多事情(可能不应该这样做),并且我确实需要使用findPreference()在点击时执行一些Java操作。现在不确定如何处理这个问题,而不是大幅改变整个东西或忽略过时警告。 :/ - Luis A. Florit
4个回答

64

有没有非过时的替代方法?

如果你在API Level 11+的设备上使用PreferenceFragment,你可以在其上调用findPreference()。否则,必须在你的PreferenceActivity中调用findPreference()

如果我还是使用它会怎样?

它可以正常工作。

如何使用Fragments更好地完成我的任务?

API Level 11+引入了PreferenceFragment作为构建PreferenceActivity内容的另一种方式。你可以使用它们,但如果你仍然支持旧设备,则不能在这些设备上使用PreferenceFragment

话虽如此:

我想检测用户点击了ListView中包含的某个Preference,以便我可以启动管理该选择的Intent。

你不需要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>
(正如在PreferenceActivity的JavaDocs中看到的) 这将在首选项UI中创建一个条目,当单击时,将使用指定的Intent启动一个活动。

非常感谢,我还有两个问题:1)在我的<PreferenceScreen>中有许多<Preference>条目,我是否仍然可以像您在片段中建议的那样使用XML方法来处理单个Preference条目?如何操作?2)假设我想要使用新的intent,我必须使用一些Java代码来创建它,对吗?希望您能帮助我,再次感谢!;D - Matteo
@Matteo:1)请阅读我提供的JavaDocs,并查看在其他首选项中使用此<intent>方法的示例。2)我不知道在这种情况下“新的intent”是什么意思。 - CommonsWare
  1. 谢谢...
  2. 让我更好地解释一下:在您的 XML 片段中描述的意图似乎只是通过打开浏览器访问网站。假设我想启动一个打开另一个活动的意图,或者从手机相册显示视频,或者其他任何事情,我应该按照标准的 Java 方式定义新的意图,对吗?
- Matteo
@Matteo:我建议你把“关于”放在选项菜单或操作栏的溢出菜单中。 - CommonsWare
它应该启动一个意图来可视化视频,或打开浏览器,或类似的任何操作。非常感谢您的帮助! - Matteo
显示剩余4条评论

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
         }
     });
  }
}

那么R.id.custom_fragment是什么?我正在尝试从我的自定义片段中获取首选项,但无法弄清楚它。 - trans
1
R.id.custom_fragment 是你定义的片段的ID。例如: <fragment android:id="@+id/custom_fragment" android:name="com.example.CustomFragment"/> - kaffee_kocher

2

2018年更新 如今,为了达到这个目的,必须在首选项片段中重写onPreferenceTreeClick方法。例如:

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

在API 15中已被弃用 - sonichy

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!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接