1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

ListPreference erstellen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Duckemai, 19.08.2010.

  1. Duckemai, 19.08.2010 #1
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Hallo zusammen,

    ich bastel derzeit an meinem ersten Menü. Dafür habe ich die Tutorials und Einträge im Internet genutzt. Aber nun hänge ich doch fest. Vielleicht kann mir hier jemand weiterhelfen?

    Ich habe eine Hauptklasse und eine Preferenceklasse erstellt.

    Ich möchte per ListPreference das Hintergrundbild der App ändern.
    (Defaultbild ist hier: main.xml : android:background="@drawable/Bild1")
    Das Menü kann ich aufrufen, auch öffnet sich dort nun die Liste, mit den Namen der Bilder (arrays.xml), die ich auswählen kann. Aber in welcher Klasse (Hauptklasse oder PreferenceActivity) lese ich den Wert aus und worin ist er eigentlich zwischengespeichert?

    Vielen Dank
    Duckemai
     
    Zuletzt bearbeitet: 19.08.2010
  2. the_alien, 19.08.2010 #2
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Die ListPreference sollte den Wert eigentlich in deine Preference Datei speichern.
     
    Duckemai bedankt sich.
  3. Duckemai, 19.08.2010 #3
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Wie wird dieser Wert denn ausgelesen? Kann mir jemand dazu ein Beispiel nennen?
     
  4. the_alien, 19.08.2010 #4
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Duckemai bedankt sich.
  5. Zonnex, 19.08.2010 #5
    Zonnex

    Zonnex Fortgeschrittenes Mitglied

    Beiträge:
    431
    Erhaltene Danke:
    49
    Registriert seit:
    12.09.2009
    Stichwort: Sharedpreference
    Schreiben:
    Code:
    SharedPreferences mySP = getSharedPreferences("MEINXYNAME", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = mySP.edit();
    editor.putString("StringKey", "InhaltXY");
    editor.commit();
    Lesen:
    Code:
    SharedPreferences mySP = getSharedPreferences("MEINXYNAME", Activity.MODE_PRIVATE);
    mySP.getString("StringKey", "DefaultWert");
    Gutes Tutorial: Android Preferences | Kaloer.com

    Viel Spaß :D
     
    Duckemai bedankt sich.
  6. Duckemai, 19.08.2010 #6
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Ja, das macht viel Spass :mad:

    Danke für den Beitrag. Ich kannte das Tutorial, komme aber nicht damit zurecht. Ich habe mir nun ein kleines App geschrieben, um das Problem zu vereinfachen. Ich kann nun die ListPreference aufrufen und einen Wert auslesen. (Die stehen in einer arrays.xml)

    In der Hauptactivity habe ich einen Button mit dem ich auch den Wert bekomme:

    String hintergrundFarbe = preferences.getString("Hintergrundbild", null);
    Toast.makeText(HelloPreferences.this,
    "You maintained user: " + hintergrundFarbe,
    Toast.LENGTH_SHORT).show();

    (Ergebnis: "Bild2.jpg")

    Das ist schon mal super. Danke dafür :)

    Ziel ist aber, dass dieser String (Bild2.jpg) direkt im Hauptprogramm das bestehende Hintergrundbild ersetzt. Das ursprüngliche Bild ist in der main.xml verankert. Ich finde aber keine Methode, die in dem Moment, in dem ich die Listauswahl der Bilder antippe, anspringt, um nun das Bild zeitgleich durch das Neue zu ersetzen. In welcher Methode muss ich das machen? Die onCreate in der PreferenceActivity springt ja bereits an, wenn ich den Menüknopf drücke und noch bevor ich die Auswahl getroffen habe.

    Vielen Dank!

    PS: Braucht man diesen "Editor" überhaupt? Geht doch auch ohne!
     
  7. the_alien, 19.08.2010 #7
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Mach dir einen OnSharedPreferenceChangeListener und hänge den an die SharedPreferences. Dann wirst du benachrichtigt wenn sich der Wert ändert.
    Alternative kannst du in onCreate() und onResume() jedesmal checken welches Hintergrundbild du anzeigen sollst.
     
    Duckemai bedankt sich.
  8. Duckemai, 19.08.2010 #8
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Ok, erst mal vielen Dank an Euch beide. Die Hälfte habe ich nun tatsächlich nach einem Tag hinbekommen. :o

    In der Preference.java habe ich den
    OnSharedPreferenceChangeListener
    eingehängt, und er gibt mir die Values der arrays.xml aus.

    Nur, kann ich von der Preference.java aus den Background verändern? Davon abgesehen, dass ich mir nicht klar darüber bin, wie man einen Background anspricht (mit Buttons heißt das Objekt "Button". Aber wie heißt es für einen Background?) kann ich aber hier keinen Zugriff
    auf das Layout nehmen. Die Buttons und der Background von der Hauptaktivity sind hier nicht erreichtbar. Muss ich den gewonnenen Wert jetzt rüberkarren oder gibt es eine Möglichkeit, den Hintergrund in der Preference.java anzusprechen?

    Danke nochmals
     
  9. the_alien, 19.08.2010 #9
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Hab ich doch oben geschrieben. Nutze in der Main Activity den Listener um mitzubekommen wann sich der Wert für den Background ändert. Alternativ hol dir den Wert bei onCreate und onResume aus den Preferences und setze den Hintergrund.
    Und setBackground ist ein Teil von View und du kannst es einfach auf dein oberstes View Element anwenden.
     
    Duckemai bedankt sich.
  10. Duckemai, 20.08.2010 #10
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Ich versuche nun das neue .jpg für den Hintergrund über onResume zu übergeben.

    Die Methode setBackground kann ich aber nicht finden.

    Es gibt 3 Methoden, die aber nicht auf ein jpg anzuwenden sind:

    View v = v.setBackgroundColor(int); //nimmt nur Farbe auf
    View v = v.setBackgroundDrawable(d); //nimmt nur ein Drawable auf. Wenn ich bei Strings.xml als value "Bild2.jpg" eingeben, dann dreht Eclipse durch
    View v = v.setBackgroundResource(resid); //nimmt wieder kein jpg auf

    Weißt Du, wie ich in dem Background das neue JPG übergeben kann (zB: als String mit dem Bildnamen ("Bild2.jpg")) ?
     
  11. the_alien, 20.08.2010 #11
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Duckemai bedankt sich.
  12. Duckemai, 21.08.2010 #12
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Ok. Das habe ich nun versucht:

    String hintergrundFarbe = preferences.getString("Hintergrundbild", null);

    final View view = this.findViewById(R.id.hinterGrund);
    final BitmapDrawable bgImage = (BitmapDrawable) this.getResources().getDrawable(R.id.preferences);
    view.setBackgroundDrawable(bgImage);

    Aber er lies das neue Bild nicht ein. In "hintergrundFarbe" steht nun "Bild2.jpg".
    Aber ist es richtig, bei getDrawable die preference zu übergeben. Ich
    bin mir nicht sicher, was mit getDrawable(resID) gemeint ist. Muss ich da noch was definieren?

    Danke
    Duckemai
     
  13. Duckemai, 22.08.2010 #13
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Habe nun herausgefunden, dass die ResId automatisch vergeben wird. Das wusste ich nicht. Und daher auch nicht, dass mit dem
    Bildnamen die ResId vorliegt. Ich suchte immer noch eine Möglichkeit, die ID dem System bekannt zu geben.
    Jetzt klappt's auch.

    Vielen Dank an Euch, :)
    Duckemai
     

Diese Seite empfehlen