2016-04-20 5 views
6

Ich habe Legacy-Code, der PreferenceActivity mit einer Unterklasse namens "Preferences" erweitert. Die PreferenceActivity wird aufgerufen, wie folgt:Wie kann man eine PreferenceActivity referenzieren oder "finden"?

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

Die OnSharedPreferenceChangeListener in einem anderen Fragment A vorhanden ist (nicht der PreferenceActivity Subklasse), sondern ein Verweis auf die PreferenceActivity braucht, um Attribute einer benutzerdefinierten Präferenz zu ändern/steuern ähnlich der folgenden:

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

wobei "prefActivity" der Verweis auf die PreferenceActivity ist. Kann jemand vorschlagen, wie eine Referenz auf die PreferenceActivity gespeichert wird, wenn sie erstellt wird, oder die PreferenceActivity bei Bedarf anderweitig zu finden?

EDIT: Einschließlich der stark vereinfachten Code, um hoffentlich helfen, Hierarchien zu zeigen und zu verdeutlichen.

Die FragmentActivity CPActivity instanziiert CPFragment und bei Bedarf (ein Tastendruck) erstellt eine Absicht, eine PreferenceActivity-Unterklasse ("Preferences" genannt) auszulösen.

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 ist unsere gemeinsame Präferenz Listener (unter anderem). In diesem Code möchten wir ein benutzerdefiniertes Steuerelement/einen benutzerdefinierten Eintrag ändern (dh nicht den Präferenzwert selbst, sondern Attribute für das Präferenzsteuerelement, z. B. eine CheckBoxPreference). Wir würden es gerne hier machen, denn hier werden die relevanten Daten berechnet.

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

Und schließlich macht die PreferenceActivity Unterklasse „Preferences“ wenig mehr als die Einstellungen Ansicht aufzurufen.

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

Wie ich bereits erwähnt, würden wir in der Lage sein es vorziehen, die benutzerdefinierte Einstellung in CPFragment (im Gegensatz zu dem PreferenceActivity) zu ändern. Daher suchte ich nach einer Möglichkeit, die PreferenceActivity zu finden, während ich in CPFragment als onSharedPreferenceChangeListener reagierte.

+0

Ich denke, dass Sie downvoted werden, weil die Frage unklar ist. Bitte klären Sie, was Sie fragen. Versuchen Sie, Ihre 'Preferences' Aktivität von einem' Fragment' zu aktualisieren? Sie können auch einen 'OnSharedPreferenceChangeListener' aus der Aktivität registrieren. –

+0

Hmmm ... nicht sicher, was unklar ist, ich behaupte, "OnSharedPreferenceChangeListener existiert in einem anderen Fragment (nicht die PreferenceActivity-Unterklasse)". Aber in diesem anderen Fragment muss ich eine benutzerdefinierte Präferenz ändern. Also brauche ich irgendwie einen Verweis auf die PreferenceActivity, um die benutzerdefinierte Präferenz zu ändern. –

Antwort

4

Wenn ich Ihre Frage richtig verstanden habe, haben Sie ein ActivityPreferences genannt, die extendsPreferenceActivity. Sie haben auch eine , die eine OnSharedPreferenceChangeListener registriert hat. Sie müssen die Benutzeroberfläche in Ihrem PreferencesActivity aktualisieren, aber Sie sind nicht sicher, wie dies zu erreichen ist.

Ist die an die PreferencesActivity angeschlossen? Wenn ja, dann sollten Sie in der Lage sein, die folgenden in Ihrem Fragment zu tun:

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

Ein anderer Ansatz:

Sie können auch eine OnSharedPreferenceChangeListener in Ihrem PreferencesActivity registrieren und Sie erhalten benachrichtigt, wenn sich die Präferenz ändert.Beispiel:

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

    /* ... */ 

} 

Manches auf der Grundlage Ihrer bearbeiteten Antwort zu berücksichtigen:

1) niemals einen static Bezug auf Ihre Activity erstellen. public static CPActivity inst;. Dies kann zu Speicherlecks führen.

2) Betrachten Code Bewegen in Ihrem PreferencesActivity zu einem PreferenceFragment.

3) Es ist immer noch unklar, was Sie erreichen möchten. Ist die CheckBoxPreference, die Sie in Ihrer CPFragment oder PreferencesActivity ändern möchten?

4) Sie noch sollten mit zwei OnSharedPreferenceChangeListener s oder eine EventBus betrachten.

+0

Ihr Verständnis der Frage ist richtig. Ich habe eine FragmentActivity, die die startActivity ausführt, die die PreferenceActivity initiiert. In Bezug auf Ihren Vorschlag "Ein anderer Ansatz" erwähnte ich in der Bounty-Veröffentlichung, dass die Registrierung eines OnSharedPreferenceChangeListener in der PreferenceActivity-Unterklasse keine gute Option war. –

+0

Sorry, nein, das Fragment ist nicht an die PreferenceActivity angehängt. Ich denke, eine andere Option wäre, einen Verweis auf die PreferenceActivity zu speichern, wenn es startActivity aufgerufen wird ... aber ich verstehe nicht, wie dies zu tun ist. –

+0

Sie können sowohl das 'Fragment' als auch das' Activity'-Register einen 'OnSharedPreferenceChangeListener' haben. Es ist keine gute Idee, auf eine "Aktivität" zu verweisen, die nicht im Vordergrund steht. Du solltest etwas Code posten, ansonsten bin ich mir nicht sicher, wie ich sonst helfen soll. –

Verwandte Themen