2017-01-02 5 views
0

Ich versuche, ein Interface zwischen einem setzen PreferenceActivity und MainActivity Aber ich halte diese Nullzeiger-Fehler bekommen:eine Schnittstelle zwischen zwei Aktivitäten Initialisieren nicht funktioniert

java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.muddii.shoplist.settingactivity.SettingsChangedListener.onValutaChanged()' on a null object reference

Wie ich verstehe, bei der Initialisierung ein Interface zwischen zwei Aktivitäten verwendet werden, dann haben Sie die Interface zum Activity deren Umsetzung zu werfen, wie ich es getan habe: settingsChangedListener = (SettingsChangedListener) getParent();

ein d Eltern ist die MainActivity, von der PrefActivity gestartet wird. MainActivity wird nie zerstört, also warum ist das Interface-Objekt null? Ich habe markiert auch MainActivity als Elternteil für PrefActivity im Manifest

PrefActivity:

public class PrefActivity extends AppCompatPreferenceActivity implements Preference.OnPreferenceChangeListener { 

SettingsChangedListener settingsChangedListener; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 

    //initializing the interface here. Parent is MainActivity 
    settingsChangedListener = (SettingsChangedListener) getParent(); 


    editTextPreference = (EditTextPreference) findPreference(VALUTA_KEY); 
    listPreference = (ListPreference) findPreference(SORT_KEY); 
    themecolorList = (ListPreference) findPreference(THEME_KEY); 

    editTextPreference.setOnPreferenceChangeListener(this); 
    listPreference.setOnPreferenceChangeListener(this); 
    themecolorList.setOnPreferenceChangeListener(this); 


} 

Antwort

0

Sie davon aus, dass getParent() kehrt etwas Nützliches. Es wird immer null, in jeder modernen Android App zurückgeben. Wenn Aktivität A Aktivität B startet, ist A nicht Elternteil von B.

+0

Wie würde ich dann in diesem Fall eine Schnittstelle für eine Aktivität initialisieren? Ich habe andere Beispiele gesehen, in denen getParent(); wird durch Kontext ersetzt – Muddz

+0

@Muddz: Sie würden nicht. Aktivitäten wie Webseiten sind weitgehend unabhängig. Höchstwahrscheinlich sollte Ihre 'MainActivity' nach Präferenzänderungen Ausschau halten und darauf reagieren. "Ich habe andere Beispiele gesehen, bei denen getParent(); durch Kontext ersetzt wurde - nicht zwischen Aktivitäten, die Sie nicht haben. – CommonsWare

+0

Also gehe ich davon aus, dass ich diese PrefActivity stattdessen mit 'startActivityForResult()' starten muss, um über Änderungen in PrefActivity benachrichtigt zu werden. – Muddz

Verwandte Themen