【问题标题】:Non Deprecated findPreference() Method? - Android不推荐使用 findPreference() 方法? - 安卓
【发布时间】:2012-06-30 08:54:48
【问题描述】:

我想检测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>

快照:

点击关于(或访问标签分类)Preference 后,我想打开某种类型的intent(也可以是视频或其他任何内容...名称具有误导性)。

【问题讨论】:

  • 我遇到了和你类似的问题。我在 Preferences 中做了很多事情(可能我不应该这样做),而且我确实需要 findPreference() 来做一些 java 点击。现在不知道如何在不严重改变整个事情或忽略弃用的情况下处理这个问题。 ://

标签: java android android-fragments deprecated android-preferences


【解决方案1】:

是否有未弃用的等价物?

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

如果没有,我还是用它怎么办?

它会起作用的。

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

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

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

【讨论】:

  • Thks 很多,只是另外两个问题:1) 我的 中有许多首选项条目 ,我还能使用您在 sn- 中建议的 XML 方法吗? p 只为一个单一的Preference 条目?如何? 2)假设我想使用一个新的intent,我不得不使用一些java代码来创建它,对吗?我希望你能帮助我,再次感谢! ;D
  • @Matteo:1) 阅读我链接到的 JavaDocs,并查看在其他偏好中使用此 &lt;intent&gt; 方法的示例。 2)我不知道在这种情况下“新的intent”是什么意思。
  • 1) 谢谢... 2) 让我解释一下:在我看来,您的XML sn-p 中描述的意图仅用于通过打开浏览器访问网站。假设我想启动一个打开另一个活动的意图,或者显示手机图库中的视频,或者其他任何东西,我应该以标准 Java 方式定义新意图,对吗?
  • @Matteo:恕我直言,偏好不应导致随机位置。首选项用于首选项,而不是用于显示视频。 &lt;intent&gt; 的目的是,如果您有一些逻辑上属于应用程序设置的内容,但无法使用标准首选项 UI 轻松呈现。话虽如此,如果您的 Intent 不是静态的,您将需要通过 Java 处理它,可能使用与您的问题相同的代码。
  • 我...!所以我不应该以我正在做的方式使用Preferences?(您可以检查问题的附加部分)...如果不是什么类我应该改用吗?非常感谢您的帮助,如果这是一个愚蠢的问题,我很抱歉,我是 android 的初学者... ;D
【解决方案2】:

如果你使用片段,你可以在偏好片段的基础上使用“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 是什么?我试图从我的自定义片段中获得偏好,但无法弄清楚。
  • R.id.custom_fragment 是您定义的片段的 id。例如:&lt;fragment android:id="@+id/custom_fragment" android:name="com.example.CustomFragment"/&gt;
【解决方案3】:

2018 年更新 今天,为此目的,必须在 Preference 片段中覆盖 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 中已弃用
【解决方案4】:

也许docs 链接不清楚。但是使用该功能非常简单。例如,您可以将其用作这样的 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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2014-05-05
    • 2012-02-22
    • 2011-08-02
    相关资源
    最近更新 更多