Неотхвърлен метод findPreference()? - Android

Искам да открия кога се щракне върху Preference, съдържащо се в ListView, за да мога да стартирам намерение за управление на този избор.

Бих направил така в моя файл layout 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>

МОМЕНТНА СНИМКА:

snapshopt

След като щракна върху Информация (или Таксономия на етикета за достъп) Preference, бих искал да отворя intent от някакъв вид (може също да е видеоклип или нещо друго... имената са подвеждащи).


person Matteo    schedule 30.06.2012    source източник


Отговори (4)


Има ли неотхвърлен еквивалент?

Ако използвате PreferenceFragment на API ниво 11+ устройства, бихте извикали findPreference() на него. В противен случай се обадете на findPreference() на вашия PreferenceActivity, тъй като нямате избор.

Ако не, какво ще стане, ако все пак го използвам?

Ще работи.

Как фрагментите могат да ми помогнат да изпълня задачата си по по-добър начин?

API Level 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)

Това ще създаде запис в потребителския интерфейс с предпочитания, който при щракване ще започне дейност с посочения Intent.

person CommonsWare    schedule 30.06.2012
comment
Благодаря много, само два други въпроса: 1) Имам много записи за предпочитания ‹Preference› в моя ‹PreferenceScreen›, мога ли да използвам подхода XML, който предлагате във фрагмента, само за един единствен запис Preference? и как? 2) Да предположим, че искам да използвам нов intent, принуден съм да използвам някакъв Java код, за да го създам, нали? Надявам се, че можете да ми помогнете, Благодаря отново! ;Д - person Matteo; 30.06.2012
comment
@Matteo: 1) Прочетете JavaDocs, към които направих връзка, и вижте примера за използването на този <intent> подход в и сред други предпочитания. 2) Нямам представа какво означава нов intent в този случай. - person CommonsWare; 30.06.2012
comment
1) Благодаря... 2) Нека обясня по-добре: стори ми се, че намерението, описано във вашия XML фрагмент, е само за посещение на уебсайт чрез отваряне на браузъра. Да предположим, че искам да стартирам намерение, отваряйки друга дейност, или показвайки видео от галерията на телефона, или нещо друго, трябва да дефинирам новото намерение по стандартния начин на Java, нали? - person Matteo; 30.06.2012
comment
@Matteo: IMHO, предпочитанията не трябва да водят до произволни места. Предпочитанията са за предпочитания, а не за показване на видеоклипове. Целта на <intent> е, ако имате нещо, което логично е част от настройките на приложението, но не може лесно да бъде изобразено с помощта на потребителския интерфейс със стандартни предпочитания. Като се има предвид това, ако вашият Intent не е статичен, ще трябва да го управлявате чрез Java, вероятно използвайки код по линия на това, което имате във вашия въпрос. - person CommonsWare; 30.06.2012
comment
Аз в...!Така че не трябва да използвам Preferences по начина, по който го правя?(Можете да проверите добавената част на въпроса)...Ако не какъв вид клас трябва да използвам вместо това?Много ви благодаря помощ и извинявай ако е тъп въпроса аз съм начинаещ в android... ;D - person Matteo; 30.06.2012
comment
@Matteo: Просто бих искал About да е в менюто ви с опции или в менюто за препълване на лентата с действия. - person CommonsWare; 30.06.2012
comment
И какъв клас трябва да използвам вместо това за другите записи? а ListActivity? - person Matteo; 30.06.2012
comment
@Matteo: Тъй като не знам какво трябва да прави Access Label Taxonomy, не мога да отговоря на този въпрос, съжалявам. - person CommonsWare; 30.06.2012
comment
Трябва да стартира намерение, визуализиращо видеоклип, или отваряне на браузъра, или нещо подобно. Благодаря за помощта, наистина! - person Matteo; 30.06.2012

Ако използвате фрагменти, можете да използвате метода "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
         }
     });
  }
}
person kaffee_kocher    schedule 11.04.2015
comment
И така, какво е R.id.custom_fragment? Опитвам се да получа предпочитанието от моя персонализиран фрагмент и не мога да го разбера. - person trans; 26.08.2016
comment
R.id.custom_fragment е идентификаторът на вашия дефиниран фрагмент. Например: <fragment android:id="@+id/custom_fragment" android:name="com.example.CustomFragment"/> - person kaffee_kocher; 28.08.2016

може би връзката 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!

person mehmet    schedule 15.04.2014

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;
    }
}
person akelec    schedule 22.10.2018
comment
Отхвърлено в API 15 - person sonichy; 13.06.2021