2016-04-20 9 views
6

Ho un codice legacy che estende PreferenceActivity con una sottoclasse chiamata "Preferences". Il PreferenceActivity viene richiamato come segue:Come fare riferimento o "trovare" un'Attività di preferenza?

Intent intent = new Intent(this, Preferences.class); 
    this.startActivity(intent); 

l'OnSharedPreferenceChangeListener esiste in un altro frammento (non la sottoclasse PreferenceActivity), ma necessita di un riferimento al PreferenceActivity per modificare gli attributi di preferenza personalizzata/controllo analogo a quanto segue:

pref = (CheckBoxPreference) prefActivity.findPreference(res.getString(R.string.keyAccount)); 
    pref.setSummary("something"); 

dove "prefActivity" è il riferimento all'Attività di preferenza. Qualcuno può suggerire come salvare un riferimento a PreferenceActivity quando viene creato o altrimenti localizzare PreferenceActivity quando necessario?

MODIFICA: Includere il codice estremamente semplificato per aiutare a mostrare le gerarchie e chiarire.

FragmentActivity CPActivity consente di creare CPFragment e su richiesta (premendo un pulsante) crea un Intent per attivare una sottoclasse PreferenceActivity (denominata "Preferences").

public class CPActivity extends FragmentActivity 
{ 
public static CPActivity inst; 
private CPFragment mFragmentCP; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    inst = this; 
    mFragmentCP = new CPFragment(); 
    } 

    public void onSettingsButtonPressed() { 
    // Bring up the Preferences menu 
    Intent intent = new Intent(this, Preferences.class); 
    this.startActivity(intent); 
    } 
} 

CPFragment è il nostro listener di preferenze condiviso (tra le altre cose). È in questo codice, dove vorremmo modificare un controllo/voce di preferenza personalizzato (cioè, non il valore di preferenza stesso, piuttosto attributi sul controllo di preferenza, ad esempio un CheckBoxPreference). Ci piacerebbe farlo qui perché è qui che vengono calcolati i dati pertinenti.

public class CPFragment extends Fragment implements OnSharedPreferenceChangeListener 
{ 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    // In response to preference changes, we want to modify the PreferenceActivity controls. 
    // So it seems we would need a reference to the PreferenceActivity subclass "Preferences 
    } 
} 

E, infine, la sottoclasse PreferenceActivity "Preferenze" non fa altro che aprire la vista delle impostazioni.

public class Preferences extends PreferenceActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences_cp); 
    } 
} 

Come ho già detto, noi preferiremmo essere in grado di modificare la preferenza personalizzato in CPFragment (in contrapposizione al PreferenceActivity). Quindi stavo cercando un modo per localizzare PreferenceActivity mentre rispondevo come onSharedPreferenceChangeListener in CPFragment.

+0

Penso che si sia downvoted perché la domanda non è chiara. Per favore chiarisci cosa stai chiedendo. Stai cercando di aggiornare la tua attività 'Preferenze' da un' Frammento'? È anche possibile registrare un 'OnSharedPreferenceChangeListener' dall'attività. –

+0

Hmmm ... non sono sicuro di cosa non è chiaro, premetto che "OnSharedPreferenceChangeListener esiste in un altro frammento (non nella sottoclasse PreferenceActivity)". Ma in questo altro frammento ho bisogno di modificare una preferenza personalizzata. Quindi ho bisogno di un riferimento in qualche modo alla PreferenceActivity per modificare la preferenza personalizzata. –

risposta

4

Se ho capito bene la tua domanda, hai un ActivityPreferences che extendsPreferenceActivity. Hai anche un Fragment che ha registrato un OnSharedPreferenceChangeListener. Devi aggiornare l'interfaccia utente nel tuo PreferencesActivity ma non sei sicuro di come farlo.

È il Fragment collegato allo PreferencesActivity? Se lo è, allora si dovrebbe essere in grado di fare quanto segue nel Fragment:

if (getActivity() instanceof Preferences) { 
    Preferences activity = (Preferences) getActivity(); 
    CheckBoxPreference pref = (CheckBoxPreference) activity.findPreference(getString(R.string.keyAccount)); 
    pref.setSummary("something"); 
} 

Un altro approccio:

È possibile anche registrare un OnSharedPreferenceChangeListener nel vostro PreferencesActivity e si otterrà notificato quando cambia la preferenza.Esempio:

public class Preferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 

    /* ... */ 

    @Override protected void onStart() { 
    super.onStart(); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    prefs.registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    if (key.equals(getString(R.string.keyAccount))) { 
     CheckBoxPreference pref = (CheckBoxPreference) findPreference(key); 
     pref.setSummary("something"); 
    } 
    } 

    @Override protected void onPause() { 
    super.onPause(); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    prefs.unregisterOnSharedPreferenceChangeListener(this); 
    } 

    /* ... */ 

} 

alcune cose da considerare, sulla base di risposta modificato:

1) Mai creare un static riferimento alla vostra Activity. public static CPActivity inst;. Questo può portare a perdite di memoria.

2) prevedere il passaggio codice nel tuo PreferencesActivity ad un PreferenceFragment.

3) Non è ancora chiaro cosa si stia cercando di ottenere. È lo CheckBoxPreference che si desidera modificare nel CPFragment o nello PreferencesActivity?

4) Si dovrebbe ancora considerare l'utilizzo di due OnSharedPreferenceChangeListener o EventBus.

+0

La tua comprensione della domanda è corretta. Ho un FragmentActivity che fa l'activityActivity che avvia PreferenceActivity. Per quanto riguarda il suggerimento "Un altro approccio", ho menzionato nel post di Bounty che la registrazione di un OnSharedPreferenceChangeListener nella sottoclasse PreferenceActivity non era una buona opzione. –

+0

Spiacente, nessun frammento non è associato a PreferenceActivity. Penso che un'altra opzione sarebbe quella di salvare un riferimento a PreferenceActivity quando è chiamato startActivity ... ma non capisco come farlo. –

+0

È possibile avere sia il 'Fragment' che' Activity' registrano un 'OnSharedPreferenceChangeListener'. Non è una buona idea fare riferimento a un 'Attività' che non è in primo piano. Dovresti postare del codice, altrimenti non sono sicuro di come altro ti possa aiutare. –

Problemi correlati