Frage zu unterschiedlichem Verhalten bei PreferenceActivity

  • Hallo,
    da bin ich schon wieder mit einer Frage:
    Wie und womit ist das unterschiedliche Verhalten einer PreferenceActivity zu erklären, in Abhängigkeit davon, ob die einzelnen Objekte in der PreferenceActivity direkt im Programmcode gesetzt werden, oder ab sie in einer xml-Datei definiert werden.


    Beispiel: eine Checkbox ist in der einstellungs.xml so definiert:
    Und so funktioniert es auch, das Editobjekt wird immer dann auch deaktiviert, wenn in der Checkbox kein Häkchen ist.

    Code
    <CheckBoxPreference
                	android:key="bei_prog_start_toggle"
                	android:title="@string/einstellungen_beiprogstart" />   
        		<EditTextPreference
               		android:key="edittext_name"
               		android:dependency="bei_prog_start_toggle" 
                	android:title="@string/einstellungen_beiprogstart_name"
                	android:dialogTitle="@string/einstellungen_beiprogstart_nametitel" />


    Wenn ich jedoch das entsprechende im Programmcode selbst setze,

    Code
    CheckBoxPreference bei_progstartCheckBoxPref = new CheckBoxPreference(this);
        	bei_progstartCheckBoxPref.setTitle(R.string.einstellungen_beiprogstart);
        	bei_progstartCheckBoxPref.setKey("bei_prog_start_toggle");   
        	bei_prog_startPrefCat.addPreference(bei_progstartCheckBoxPref);
        	EditTextPreference editTextname = new EditTextPreference(this);
        	editTextname.setDialogTitle(R.string.einstellungen_beiprogstart_nametitel);
        	editTextname.setKey("edittext_name");
        	editTextname.setDependency("bei_prog_start_toggle");


    so funktioniert es nicht, ich erhalte einen Fehler genau an der Stelle, wo setDependency aufgelöst werden soll,

    Code
    01-03 16:41:09.119: E/AndroidRuntime(4209): Caused by: java.lang.IllegalStateException: Dependency "bei_prog_start_toggle" not found for preference "edittext_name" (title: "null"


    Ich hatte gedacht setDependency würde genauso arbeiten wie android:dependency
    Welchen Gedankenfehler mach ich?
    Fragende Grüße, schymura ?(

  • Hallo killphil75,
    danke für die schnelle Antwort.
    Auf Grund deiner Aussage habe ich nun also die Reihenfolge im Programmcode umgestellt.


    Das Ergebnis ist identisch zu dem ersten Versuch:

    Code
    01-03 21:24:53.239: E/AndroidRuntime(4578): Caused by: java.lang.IllegalStateException: Dependency "bei_prog_start_toggle" not found for preference "edittext_name" (title: "Name"


    Da scheine ich wohl mal wieder etwas falsch verstanden zu haben.....
    Schöne Grüße, schymura ?(

  • Hallo killphil75,
    danke für die Antwort und vor allem für den Link!
    Nachdem ich dann (fast) alle Möglichkeiten durchprobiert habe, die dort genannt wurden um setDependency() zum Laufen zu bekommen habe ich es nun geschafft!
    Hier die richtige Lösung:
    1: Gleich nach der Erzeugung des PreferenceScreen muss setPreferenceScreen() aufgerufen werden.

    Code
    private PreferenceScreen createPreferenceHierarchy() {
       		PreferenceScreen roots = getPreferenceManager().createPreferenceScreen(this);	
        	setPreferenceScreen(roots);


    Dann kann man im weiteren dann setDependency() entsprechend aufrufen, aber immer erst NACH dem Einfügen mit addPreference()

    Code
    CheckBoxPreference bei_progstartCheckBoxPref = new CheckBoxPreference(this);
        	bei_progstartCheckBoxPref.setTitle(R.string.einstellungen_beiprogstart);
        	bei_progstartCheckBoxPref.setKey("toggel_bei_prog_start");   
        	bei_prog_startPrefCat.addPreference(bei_progstartCheckBoxPref);
        	EditTextPreference editTextname = new EditTextPreference(this);
        	editTextname.setDialogTitle(R.string.einstellungen_beiprogstart_nametitel);
        	editTextname.setKey("edittext_name");
        	editTextname.setTitle(R.string.einstellungen_beiprogstart_name);
        	bei_prog_startPrefCat.addPreference(editTextname); 
        	editTextname.setDependency(bei_progstartCheckBoxPref.getKey());


    Und das GANZ wichtige ist, wie in der letzten Quelltextzeile zu sehen, dass man nicht die Zeichenfolge nutzt, die man bei setKey() als String eingeben muss, sondern dass man die .getKey() des entsprechenden Objekts aufruft.
    Nur so gibt es keinen Absturz.
    Fröhliche, dankbare Grüße, schymura. ^^

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!