2016-04-20 10 views
6

Mam starszy kod, który rozszerza PreferenceActivity z podklasą o nazwie "Preferences". PreferenceActivity wywoływany jest w następujący sposób:Jak odwołać się lub "znaleźć" PreferenceActivity?

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

OnSharedPreferenceChangeListener występuje w drugiego fragmentu (nie podklasy PreferenceActivity), ale musi odniesienie do PreferenceActivity w celu modyfikacji cech preferencją dostosowanych/sterowania podobny do:

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

gdzie "prefAktywność" jest odniesieniem do PreferenceActivity. Czy ktoś może zasugerować, w jaki sposób zapisać odniesienie do PreferenceActivity, gdy jest on tworzony lub w inny sposób zlokalizować PreferenceActivity w razie potrzeby?

EDYTOWANIE: W tym rażąco uproszczony kod, aby pomóc w wyświetlaniu hierarchii i wyjaśnieniu.

Funkcja FragmentActivity CPActivity tworzy instancję CPFragment i na żądanie (naciśnięcie przycisku) tworzy intencję uruchomienia podpozycji PreferenceActivity (zwanej "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 jest naszym wspólnym słuchaczem preferencji (między innymi). W tym kodzie chcemy zmodyfikować niestandardową kontrolę preferencji/wpis (to znaczy nie samą wartość preferencji, a raczej atrybuty w elemencie kontroli preferencji, np. CheckBoxPreference). Chcielibyśmy to zrobić tutaj, ponieważ tutaj obliczane są odpowiednie dane.

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

I wreszcie podklasa PreferenceActivity "Preferences" robi niewiele więcej niż widok Settings.

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

Jak już wspomniałem, wolimy być w stanie zmodyfikować preferencję Niestandardowa w CPFragment (w przeciwieństwie do PreferenceActivity). Dlatego szukałem jakiegoś sposobu na zlokalizowanie PreferenceActivity podczas odpowiadania jako onSharedPreferenceChangeListener w CPFragment.

+0

Myślę, że dostajesz obniżone oceny, ponieważ pytanie jest niejasne. Proszę wyjaśnić, o co prosisz. Czy próbujesz zaktualizować działanie 'Preferences' z' Fragment'? Możesz zarejestrować 'OnSharedPreferenceChangeListener' również z działania. –

+0

Hmmm ... nie jestem pewien, co jest niejasne, stwierdzam "OnSharedPreferenceChangeListener istnieje w innym fragmencie (nie podklasę PreferenceActivity)". Ale w tym innym Fragmentie muszę zmodyfikować niestandardową preferencję. Potrzebuję więc odwołania do PreferenceActivity w celu zmodyfikowania niestandardowych preferencji. –

Odpowiedz

4

Jeśli dobrze rozumiem twoje pytanie, masz Activity o nazwie Preferences, które extendsPreferenceActivity. Masz również Fragment, który zarejestrował numer OnSharedPreferenceChangeListener. Musisz zaktualizować interfejs w swoim PreferencesActivity, ale nie wiesz, jak to zrobić.

Czy Fragment jest dołączone do PreferencesActivity? Jeśli tak jest, to powinieneś być w stanie wykonać następujące czynności w Fragment:

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

Innym podejściem:

Można również zarejestrować OnSharedPreferenceChangeListener w PreferencesActivity a dostaniesz powiadomiony, gdy zmiana preferencji.Przykład:

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

    /* ... */ 

} 

kilka rzeczy do rozważenia na podstawie edytowanego odpowiedź:

1) Nigdy stworzyć static odniesienie do swojej Activity. public static CPActivity inst;. Może to prowadzić do wycieków pamięci.

2) rozważyć przeniesienie kodu w PreferencesActivity do PreferenceFragment.

3) Nie jest jasne, co próbujesz osiągnąć. Czy CheckBoxPreference chcesz zmodyfikować w swoim lub PreferencesActivity?

4) Powinieneś rozważyć użycie dwóch OnSharedPreferenceChangeListener s lub.

+0

Twoje zrozumienie pytania jest poprawne. Mam funkcję FragmentActivity, która uruchamia program startActivity, który inicjuje działanie PreferenceActivity. Odnośnie do sugestii "Innego podejścia", wspomniałem w poście Bounty, że rejestrowanie OnSharedPreferenceChangeListener w podklasie PreferenceActivity nie było dobrą opcją. –

+0

Niestety, żaden fragment nie jest dołączony do PreferenceActivity. Myślę, że inną opcją byłoby zapisanie odniesienia do PreferenceActivity, gdy nazywa się to startActivity ... ale nie rozumiem, jak to zrobić. –

+0

Możesz mieć zarówno 'Fragment' i' Activity' zarejestrować 'OnSharedPreferenceChangeListener'. Nie jest dobrym pomysłem odwołanie się do "Czynności", która nie jest na pierwszym planie. Powinieneś opublikować kod, w przeciwnym razie nie jestem pewien, jak inaczej pomóc. –

Powiązane problemy