Wert beim Start der App aus SharedPreferences auslesen

N

no1Ltan

Fortgeschrittenes Mitglied
7
Hallo,

ich stehe in meiner App vor einem Problem und möchte dieses mithilfe einer kleinen Test-App besser demonstrieren.

Kurze Erläuterung zur Funktionsweise der Test-App:
- 2 Radio-Buttons, die beim Klick entweder die String-Variable namens mode auf "A" oder "B" setzen
- 1 TextView, die beim Klick einen Zahlenwert addiert
- ist der Modus B -> Zahlenwert um 2 erhöhen
- ansonsten -> Zahlenwert um 1 erhöhen.

Es funktioniert an sich einwandfrei (bis auf dass die TextView sich beim Drehen nicht aktualisiert - aber das ist nicht relevant.)
Die Werte werden alle gespeichert und wenn ich die App neu starte, ist der RadioButton gecheckt und dessen Wert ("A" oder "B")
wird automatisch ermittelt - zeigt auch die Log.

Allerdings funktioniert die if-Abfrage nicht.
Obwohl mode den Wert "B" hat, läuft trotzdem die else durch.
Ich muss also nochmals auf den bereits gecheckten RadioButton B klicken, damit mode dann auch tatsächlich den Wert "B" hat.

Theoretisch müsste ich die String-Variable mode nicht deklarieren, sondern mit dem Wert aus der SharedPreferences initialisieren.
Aber wie soll das gehen?

MainActivity.java
Code:
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
{
    int points = 0; // Gets shown in textViewPoints
    String mode; // Can be A or B
    private static final String STATE_POINTS = "state_points";
    private static final String STATE_MODE = "state_mode";
    RadioGroup radioGroup;
    final String KEY_SAVED_RADIO_BUTTON_INDEX = "SAVED_RADIO_BUTTON_INDEX";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView textViewPoints = findViewById(R.id.text_view_points); // Link variable to ID
        RadioButton radioButtonSingle = findViewById(R.id.radio_button_single); // Link variable to ID
        RadioButton radioButtonDouble = findViewById(R.id.radio_button_double); // Link variable to ID

        SharedPreferences prefs = getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE); // Load SharedPreferences file
        mode = prefs.getString("mode", mode); // Load saved mode (A or B)
        int savedRadioIndex = prefs.getInt(KEY_SAVED_RADIO_BUTTON_INDEX, 0);
        Log.wtf("loaded mode:", mode); // Log is successful!
        radioGroup = findViewById(R.id.radio_group);
        radioGroup.setOnCheckedChangeListener(radioGroupOnCheckedChangeListener);
        textViewPoints.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (mode == "B") // If mode B was chosen:
                {
                    points = points + 2; // Increment points by 2
                }
                else // Otherwise:
                {
                    points++; // Increment points by 1
                }
                String pointsString = Integer.toString(points); // Convert int to string
                textViewPoints.setText(pointsString); // Update textViewPoints
            }
        });
        RadioButton savedCheckedRadioButton = (RadioButton) radioGroup.getChildAt(savedRadioIndex);
        savedCheckedRadioButton.setChecked(true);

        radioButtonSingle.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                setMode("A"); // Write mode A in SharedPreferences
                mode = "A";
            }
        });
        radioButtonDouble.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                setMode("B"); // Write mode B in SharedPreferences
                mode = "B";
            }
        });

    }
    RadioGroup.OnCheckedChangeListener radioGroupOnCheckedChangeListener =
            new RadioGroup.OnCheckedChangeListener()
            {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId)
                {
                    RadioButton checkedRadioButton = radioGroup.findViewById(checkedId);
                    int checkedIndex = radioGroup.indexOfChild(checkedRadioButton);
                    savePreferences(KEY_SAVED_RADIO_BUTTON_INDEX, checkedIndex);
                }
            };
    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        super.onSaveInstanceState(outState);
        outState.putInt(STATE_POINTS, points);
        outState.putString(STATE_MODE, mode);
    }
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        super.onRestoreInstanceState(savedInstanceState);
        points = savedInstanceState.getInt(STATE_POINTS);
        mode = savedInstanceState.getString(STATE_MODE);
    }
    public void savePreferences(String key, int value)
    {
        SharedPreferences prefs = getSharedPreferences("MY_SHARED_PREF", Context.MODE_MULTI_PROCESS); // Create new SharedPreferences instance
        SharedPreferences.Editor editor = prefs.edit();
        editor.putInt(key, value);
        editor.commit();
    }
    public void setMode(String mode) // Receive String value for mode
    {
        SharedPreferences prefs = getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE); // Create new SharedPreferences instance
        SharedPreferences.Editor editor = prefs.edit(); // Create editor variable for SharedPreferences
        editor.putString("mode", mode); // Write string mode
        editor.commit(); // Apply settings, close SharedPreferences instances
        Log.wtf("mode", mode); // Log is successful!
    }
}

Danke für jede Hilfe.

P.S. Aber selbst wenn ich mit String mode = "B"; initialisiere, funktioniert es nicht!

Grüße
 
Hi du progmmierst in Java nicht in C.
String Vergleich in Java.
If (st1.equals(skt2))
 
  • Danke
Reaktionen: no1Ltan
Hi jogimuc,
Danke für die schnelle Antwort!
Es klappt! :)
Code:
if (mode.equals("B")) // If mode B was chosen:

Aber schon komisch, dass es auch vorher teilweise funktionierte.
Mit teilweise meine ich, dass beim Checken des RadioButtons die if-Abfrage korrekt durchläuft.

Viele Grüße
 
Dann überlege mal selber was bei deiner Variante passirt.
String ist in Java eine Klasse und nicht wie in C ein datatentyp.
 
Ja, da hast du sicherlich recht, aber komisch finde ich nur, dass es teilweise funktionierte.
Wie ich ja schrieb, nach dem Klick auf den RadioButton hat es geklappt.
Nach direkten Start der App dann nicht, erst wieder nach dem RadioButton-Klick.

Meiner Meinung nach sollte etwas entweder richtig oder falsch sein.
Teilweise richtig ist etwas seltsam.
An der Tankstelle hilft es mir auch nicht, wenn ich fast das richtige tanke ;)

Ich hätte mal noch eine andere Frage (wollte nicht schon wieder ein neues Thema eröffnen):
Ist es möglich, dass man einen Wert innerhalb einer Variablenbezeichnung durch eine Variable festlegt?
Statt prefsA, prefsB, "MY_SHARED_PREF_A" und "MY_SHARED_PREF_B" hätte ich gerne:
prefsVARIABLE und "MY_SHARED_PREF_VARIABLE"

Anstatt wie in diesem Beispiel nach den einzelnen Modi abzufragen:
Code:
SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
mode = prefs.getString("mode", mode);
if (mode.equals("A"))
{
    SharedPreferences prefsA = getActivity().getSharedPreferences("MY_SHARED_PREF_A", MODE_PRIVATE);
    .
}
if (mode.equals("B"))
{
    SharedPreferences prefsB = getActivity().getSharedPreferences("MY_SHARED_PREF_B", MODE_PRIVATE);
    .
}

Würde ich die Variablennamen von prefs und "MY_SHARED_PREF_" direkt ändern:

Code:
SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
mode = prefs.getString("mode", mode);
SharedPreferences prefs+mode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE);

Bei dem "MY_SHARED_PREF_"+mode scheint der Editor damit einverstanden zu sein.
Allerdings sieht er prefs+mode als Problem.
Vllt. nur ein kleines Syntax-Problem?

Grüße
 
Hallo bei deinen Fragen fällt mir auf das du scheinbar einige Lücken in Bezug auf Java hast.

SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
Und
SharedPreferences prefsA = getActivity().getSharedPreferences SharedPreferences prefsA = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);

Ist eigentlich das gleiche “prefs” und “prefsA” sind beides Variablen auf das gleiche Objekt. Das du mit getSharedPrefferences zurückbekommst und in der Variablen Speicherst.


„SharedPreferences prefs+mode =“ was soll das „prefs+mode“ währe hier dein Variablen Bezeichner der Name der Variablen da kannst du nichts addieren. Sonderzeichen solzen nicht in Variablen Namen benutzt werden.

Du kannst strings mit Hilfe des Operator + zusammenfügen ergänzen. Aber nicht den Bezeichner.
Schaue dir dazu nochmal das Erstellen von Variablen in Java an. Vorallen weche Zeichen ein Variablenname haben darf, erlaubt sind.
Java Grundwissen würde ich sagen.

Das dies hier geht
getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE);
kannst du dir selber zusammen reimen wenn du die Doku liest.
Denn der erste Parameter ist der Name der Pref-Datei in der deine Daten gepeichert werden. Wenn du nun eine andere als die Standart Datei benutzt wird sie natürlich auch anstandslos erzeugst. Aber wenn du wieder daraus was lesen willst musst du auch wieder diesen Dateinamen angeben.
("MY_SHARED_PREF_"+mode) ist dann der neue Dateiname wobei „mode“eine Variable ist
MY_SHARED_PREF ist eine konstante Variable auf den echten Dateinamen.


Ich kann echt nicht nachvolziehen was das soll oder wass du damit willst.

Wieso willst du jeden wert in einer eigenen Datei speichern? Glaube nicht das es so viele Einträge sind das die Geschwindigkeit leidet. Das müßten dann schon hunderte sein.

Wie gesagt schaue dir an was die Methoden machen und was die Übergabe-Parameter sind.

Context | Android Developers

SharedPreferences | Android Developers
 
Zuletzt bearbeitet:
Hallo jogimuc,

warum ich das will/brauche, lässt sich super mit diesen 2 Skizzen darstellen:

kxc34auh.png


lucqf5tg.png


Nochmal kurz erklärt:
Mithilfe von Screen 2 kann ich TextViews, die auf Screen 1 sind, ein- oder ausblenden.
Um Flexibilität zu gewährleisten, möchte ich gerne in verschiedenen Modi arbeiten.
Dadurch hat man den Vorteil, dass die Einstellungen alle unabhängig voneinander sind.

Screen 4 ist im Prinzip nur da, gewisse Modi aus Screen 3 herauszufiltern.
Mit Screen 3 kannst du einen Modus wählen (es kann immer nur 1 aktiv sein).

Die Elemente aus Screen 2 sind immer sichtbar und sorgen, wie schon erwähnt, für die Sichtbarkeit der Elemente aus Screen 1.

Befinde ich mich z.B. in Modus 1 und kreuze alle Checkboxen an, möchte ich nicht,
dass diese auch automatisch für die anderen Modi angekreuzt sind.
(Sonst bräuchte ich ja keine Modi!)

Aus diesem Grund war meine Idee, mit verschiedenen SharedPreferences zu arbeiten.
Und in Abhänhigkeit davon, welcher Modus aktiv ist, soll dann die entsprechende SharedPreferences
gelesen und/oder beschrieben werden.

Es funktioniert mit:
Code:
SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
mode = prefs.getString("mode", mode);
if (mode.equals("A"))
{
    SharedPreferences prefsA = getActivity().getSharedPreferences("MY_SHARED_PREF_A", MODE_PRIVATE);
    .
}
if (mode.equals("B"))
{
    SharedPreferences prefsB = getActivity().getSharedPreferences("MY_SHARED_PREF_B", MODE_PRIVATE);
    .
}

aber meiner Meinung nach ist das unnötiger Code.
In einer anderen Programmiersprache (kannst dir sicherlich denken welche ;) ), mache ich das einfach mithilfe von:
%variable%

Also wäre das von der SYNTAX her so:

Code:
SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
mode = prefs.getString("mode", mode);
SharedPreferences prefs%mode% = getActivity().getSharedPreferences("MY_SHARED_PREF_%mode%", MODE_PRIVATE);

Das + was ich oben geschrieben hatte, soll keine Addition sein, es soll ein Platzhalter sein.

Ich hoffe, es ist jetzt etwas klarer :)

P.S. Wir wissen beide, dass meine Java-Kenntnisse nicht gut sind, aber bin wie gesagt immer noch Anfänger.
 
Platzhalter in Varaiblenbezeichner gibt es nicht.

Warum so komplizirt.
Frage deine Modi aus der globalen pref ab.
Benutze eine neue pref variable und weise ihr die Instanz der perf Datei zu.
Anschließend arbeitest du mit dieser variablen dazu braucht du nicht zwei verschiedenen.

Code:
SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
mode = prefs.getString("mode", mode);
SharedPreferences prefsMode;

if (mode.equals("A"))
{
   prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_A", MODE_PRIVATE);
    .
}
if (mode.equals("B"))
{
    prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_B", MODE_PRIVATE);
    .
}

am besten setzt du die Definition prefMode in den Klassen Rumpf damit du ihn in allen Methoden verwenden kannst.

mode = prefs.getString("mode", mode);
Ist auch so nicht sinnvoll denn der zweite Parameter sollte ein default String sein, wenn es nicht möglich ist die Daten auszulesen. Es macht keinen Sinn dafür die selbe variable zu benutzen in der du gerade was speichern willst. Sinnvoll wäre n deinem Fall "A" o "B"

getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE);
Kannst du machen.
Nur beim Bezeichner geht das nicht, und ein + ist auch nicht in einem Bezeichnet erlaubt.
Schau dir an was der + Operator macht bei Strings.
Das hat mit Platzhalter wildcards nichts zu tunen. Damit kannst du einen String erweitern etwas anhängen.



[doublepost=1536851677,1536850570][/doublepost]Von welcher Script Sprache kommst du?

Java ist eine statische Typisirte Sprache da kann der Variablen Bezeichner nicht zu Laufzeit geändert werden. Der wird beim Kompilieren festgelegt.

Scriptsprachen sind oft dynamisch Typisirte Srachen die nicht Kompiliert sondern meistens Interpretiert werden . Da werden die Datentypen erst zur Laufzeit geprüft und können somit auch geändert werden. Was aber auch oft zu unerwarteten Fehlern führt.





Zu dem Thema mit dem if.
Dachte du kommst selbst auf die Lösung.
Aus deiner Sicht nur teilweise weil immer nur der else Zweig ausgeführt wird. Denn dein vermutlicher Vergleich gibt immer false unwahr zurück. Wenn du laut Programm Logik ein false erwartet wird scheint dein progamm korrekt zu laufen. In dem Moment wo du ein true erwartest wird wider der else Zweig ausgeführt. Somit für dich nur teilweise. Eigentlich ist es immer nur der else Zweig denn die String Instanz kann niemals gleich einen ascii oder unicode Zeichen sein.



String mode = prefs.getString("mode", "A");
SharedPreferences prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE);

solte auch gehen.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: no1Ltan
Hallo jogimuc,

erstmal ein großes Dankeschön für dein Engagement!
Ich hatte kurz eine "Auszeit" von diesem Thread hier genommen, da es mir insgesamt zu kompliziert wurde.
(Hatte mich zwischenzeitlich aber mit anderen Elementen aus dem Bereich Android beschäftigt.)

Jetzt habe ich mich wieder rangesetzt und gute Fortschritte gemacht.
Dank deiner Hilfe war es mir möglich, es so zu programmieren, dass verschiedene Einstellungen unabhängig voneinander gespeichert und geladen werden.
Da die ursprüngliche App zu groß wurde habe ich eine Single-Activity-App erstellt um das einfacher zu implementieren und zu testen.
(Zu groß aus Sicht eines Anfängers, der sich schrittweise herantasten muss.)

Die Activity besteht aus:
- 3 Buttons, die den Hintergrund einer TextView ändern
- 3 Buttons, die den Text einer TextView ändern
- 3 buttons, die den Modus wechseln.
- 1 TextView, deren Hintergrund + Text mithilfe der Buttons geändert wird
(Im Prinzip nichts neues - unten habe ich noch eine kurze GIF-Animation beigefügt.)

Beim Starten der App befinde ich mich in dem zuletzt ausgewählten Modus, z.B. C. -> Beim allerersten Start wird A als default mode geladen.
Ich klicke die Buttons zum Wechseln der Farbe und des Texts und diese werden in den Modus C gespeichert.
Wechsele ich den Modus, werden dessen Werte geladen -> auch hier default-Werte, für den Fall, dass noch nichts existiert.
Anschließend werden neue Farb- und Textwerte in den Modus gespeichert.

Im Log sehe ich, dass nach jedem Buttonklick die korrekten Werte angezeigt werden.
Modus, Text und Farbe, wie z.B.:
Klick auf Modus A:
E/Farbe:: blau
E/Modus:: A
E/Text:: 2

Klick auf Modus B:
E/Farbe:: grün
E/Modus:: B
E/Text:: 1
etc.

Da ich vor Kurzem auch mit dem OnSharedPreferenceChangeListener gearbeitet habe, wollte ich diesen ebenfalls integrieren.
Ansonsten hätte ich immer erst das Display kippen müssen, um das Neu-Erzeugen der View zu provozieren.
(Um somit automatisch alles zu laden.)

Mit dem OnSharedPreferenceChangeListener klappt es aber nur teilweise!
Starte ich die App und fange an, auf die Buttons Text und Farbe zu klicken, ändern sich die TextView-Eigenschaften sofort.
Das ist richtig.

Alles klappt, bis auf 1 Sache:
Drücke ich auf Modus, ändert sich optisch nichts.
Der OnSharedPreferenceChangeListener scheint nicht einzugreifen.

Das ist der Code:
(Mit GitHub kenne ich mich nicht so aus - aber wenn du möchtest, versuche ich das Projekt da hochzuladen.)
MainActivity.java:
Code:
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
{
    // Global variables:
    Button buttonModeA, buttonModeB, buttonModeC, buttonRed, buttonBlue, buttonGreen, buttonNr1, buttonNr2, buttonNr3; // Change mode, color and text
    TextView textViewMode; // Optical feedback after pressing a button
    String mode, farbe, text; // Specifies mode, string value for Log, text for textViewMode
    int bColor; // Background color for textviewMode
    SharedPreferences prefsMode; // Specific SharedPreferences (modes)

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Link variables to IDs:
        buttonModeA = findViewById(R.id.button_load_a);
        buttonModeB = findViewById(R.id.button_load_b);
        buttonModeC = findViewById(R.id.button_load_c);
        buttonRed = findViewById(R.id.button_red);
        buttonBlue = findViewById(R.id.button_blue);
        buttonGreen = findViewById(R.id.button_green);
        buttonNr1 = findViewById(R.id.button_nr_1);
        buttonNr2 = findViewById(R.id.button_nr_2);
        buttonNr3 = findViewById(R.id.button_nr_3);
        textViewMode = findViewById(R.id.text_view_mode);

        loadModeAndSettings(); // Retrieve current mode and load its settings
        SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() // Create new instance
        {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) // Detect changed key(s)
            {
                if (key.equals("mode")) // If mode was changed:
                {
                    textViewMode.setBackgroundColor(bColor); // Update background color of textViewMode
                    textViewMode.setText(text); // Update text of textViewMode
                }
                if (key.equals("bColor")) // If background color was changed:
                {
                    textViewMode.setBackgroundColor(bColor); // Update background color of textViewMode
                }
                if (key.equals("text")) // If text was changed:
                {
                    textViewMode.setText(text); // Update text of textViewMode
                }
            }
        };
        prefsMode.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); // Load sharedPreferenceChangeListener

        buttonModeA.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "A"; // Set mode to A
                saveMode(); // Save selected mode
            }
        });
        buttonModeB.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "B"; // Set mode to B
                saveMode(); // Save selected mode
            }
        });
        buttonModeC.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "C"; // Set mode to C
                saveMode(); // Save selected mode
            }
        });
        buttonRed.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.red); // Set background color to red
                farbe = "rot"; // Set string value for Log
                saveSettings(); // Save settings
            }
        });
        buttonBlue.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.blue); // Set background color to bluw
                farbe = "blau"; // Set string value for Log
                saveSettings(); // Save settings
            }
        });
        buttonGreen.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.green); // Set background color to green
                farbe = "grün"; // Set string value for Log
                saveSettings(); // Save settings
            }
        });
        buttonNr1.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                text = "1"; // Set text to 1
                saveSettings(); // Save settings
            }
        });
        buttonNr2.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                text = "2"; // Set text to 2
                saveSettings(); // Save settings
            }
        });
        buttonNr3.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                text = "3"; // Set text to 3
                saveSettings(); // Save settings
            }
        });
    }
    public void saveMode()
    {
        SharedPreferences prefs = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Create new SharedPreferences instance
        SharedPreferences.Editor editor = prefs.edit(); // Create access variable for editor
        editor.putString("mode", mode); // Put received value for mode into editor
        editor.apply(); // Save + close instance
    }
    public void saveSettings()
    {
        SharedPreferences prefsMode = getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Create new SharedPreferences instance for selected mode
        SharedPreferences.Editor editorMode = prefsMode.edit(); // Create access variable for editor
        editorMode.putInt("bColor", bColor); // Put received value into editor
        editorMode.putString("farbe", farbe); // Put received value into editor
        editorMode.putString("text", text); // Put received value into editor
        editorMode.apply(); // Save + close instance
    }
    public void loadModeAndSettings()
    {
        SharedPreferences prefs = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Load saved shared file
        mode = prefs.getString("mode", "A"); // mode or default value: A

        prefsMode = getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Retrieve current prefsMode
        bColor = prefsMode.getInt("bColor", 0); // Load value of background color or default value
        farbe = prefsMode.getString("farbe", "default"); // Load value of color string or default value
        text = prefsMode.getString("text", "default"); // Load value of text string or default value

        textViewMode.setBackgroundColor(bColor); // Set background color of textViewMode
        textViewMode.setText(text); // Set text of textViewMode

        Log.wtf("Farbe: ", farbe); // CORRECT!
        Log.wtf("Modus: ", mode); // CORRECT!
        Log.wtf("Text: ", text); // CORRECT!
    }
}

P.S. Die Variablen habe ich global deklariert, da ich sonst mehr Methoden gebraucht hätte.

Danke für jede Hilfe!

gjnx7kad.gif
 
Hi
Ich würde das etwas anders machen .
Zum ausgeben schreibe ich meistens eine eigene Methode in der alle Views geupdatet werden.
Diese rufe ich immer auf wenn sich bei der Anzeige etwas ändert .

In dem onSharedPreferenceChanged Listner könntest du diese Methode auch aufrufen und zwar immer ohne ein if denn wenn du einen Mode Butten Klicks änderst du ja auch etwas an den Pref und es müsste der Listner Aufgerufen werden .Verstehe nicht warum du da noch Fallunterscheidungen machst.

Wenn dein Modus zb vom letzen mal auf A steht und du erneut auf A klickst wird nichts geändert somit wird auch der Listner nicht aufgerufen. Am Anfang beim Start solltest du immer die ViewUpdate Methode aufrufen auch erst mal das VariablenSet aus den Prefs holen.
 
  • Danke
Reaktionen: no1Ltan
Bei Zahlen und Farbe rufst Du saveSettings(); auf, aber bei Buchstaben saveMode();?

Warum verwendest Du denn 2 sharedPrefs?
 
@reallord
weil er den Mod in einer anderen Pref Datei speichert, und die Settings auch in drei verschiedenen pref Datein.
Das saveMod ist somit sein globals Pref und die anderen sollen Voreingestellte Sets darstellen.
Ist schon soweit Richtig.
 
Hallo ihr zwei!

@reallord:
Ja, jogimuc hat es vollkommen richtig erklärt.

@jogimuc:
Ok, ich habe es jetzt umgeschrieben und es funktioniert perfekt.
Egal welchen Button ich drücke - die View-Elemente werden sofort geupdated und angezeigt.
(Außer natürlich ich klicke 2x denselben Button, dann ändert sich optisch nichts - logisch)
Auch nach dem Drehen des Displays ist noch alles in Ordnung.

Ich weiß aber dennoch nicht, ob ich deine Erklärung zu 100% verstanden habe.
(Wirst du ja dann im Code sehen.)
Den SharedPreferenceChangeListener habe ich übrigens komplett rausgeschmissen, da es auch ohne ihn funktioniert hat.

2 Punkte sind für mich jedoch verwirrend:
1)
Die Methode updateGui(), die in meinem Fall alle Views updated, tut im Prinzip mehr, als sie tun soll.
Wenn ich z.B. 10 Elemente habe und nur 1 Element verändere, werden die anderen 9 doch umsonst geupdated.
Performance-technisch gesehen ist das eher ineffizient, oder nicht?

Die updateGui()-Methode habe ich sowohl in die loadModeAndSettings() als auch in die saveSettings() integriert.

2)
Auch wenn alles in diesem Beispiel klappt, handelt es sich dennoch nur um eine Single-Activity-App.
Sobald ich dann mit mehreren Activities oder gar mit Fragmenten arbeite, sieht's doch wieder anders aus?!
Du kennst ja meine anderen "Test-Apps" - oder auch die, die ich ursprünglich hier im Thread postete.
(Im Beitrag #7 in diesem Thread ist die Skizze zu sehen).

Ich mein einerseits freue ich mich, dass diese Test-App hier einwandfrei funktioniert,
aber ich bin skeptisch, ob mir das für die anderen Apps was bringt.

Code:
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
{
    // Global variables:
    //------------------
    Button buttonModeA, buttonModeB, buttonModeC, buttonRed, buttonBlue, buttonGreen, buttonNr1, buttonNr2, buttonNr3;
    TextView textViewMode;
    String mode, farbe, text;
    int bColor; // Background color for textview
    SharedPreferences prefsMode; // Specific SharedPreferences (modes)

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Link variables to IDs
        //-----------------------
        buttonModeA = findViewById(R.id.button_load_a);
        buttonModeB = findViewById(R.id.button_load_b);
        buttonModeC = findViewById(R.id.button_load_c);
        buttonRed = findViewById(R.id.button_red);
        buttonBlue = findViewById(R.id.button_blue);
        buttonGreen = findViewById(R.id.button_green);
        buttonNr1 = findViewById(R.id.button_nr_1);
        buttonNr2 = findViewById(R.id.button_nr_2);
        buttonNr3 = findViewById(R.id.button_nr_3);
        textViewMode = findViewById(R.id.text_view_mode);
      
        loadModeAndSettings(); // Retrieve current mode and load its settings
      
        buttonModeA.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "A"; // Set mode to A
                saveMode(); // Save selected mode
                loadModeAndSettings();
            }
        });
        buttonModeB.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "B"; // Set mode to B
                saveMode(); // Save selected mode
                loadModeAndSettings();
            }
        });
        buttonModeC.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "C"; // Set mode to C
                saveMode(); // Save selected mode
                loadModeAndSettings();
            }
        });
        buttonRed.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.red); // Set background color to red
                farbe = "rot"; // Set string value for Log
                saveSettings(); // Save settings
            }
        });
        buttonBlue.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.blue); // Set background color to blue
                farbe = "blau"; // Set string value for Log
                saveSettings(); // Save settings
            }
        });
        buttonGreen.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.green); // Set background color to green
                farbe = "grün"; // Set string value for Log
                saveSettings(); // Save settings
            }
        });
        buttonNr1.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                text = "1"; // Set text to 1
                saveSettings(); // Save settings
            }
        });
        buttonNr2.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                text = "2"; // Set text to 2
                saveSettings(); // Save settings
            }
        });
        buttonNr3.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                text = "3"; // Set text to 3
                saveSettings(); // Save settings
            }
        });
    }
    public void updateGui()
    {
        textViewMode.setBackgroundColor(bColor); // Update background color of textViewMode
        textViewMode.setText(text); // Update text of textViewMode
    }
    public void saveMode()
    {
        SharedPreferences prefs = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Create new SharedPreferences instance
        SharedPreferences.Editor editor = prefs.edit(); // Create access variable for editor
        editor.putString("mode", mode); // Put received value for mode into editor
        editor.apply(); // Save + close instance
    }
    public void saveSettings()
    {
        SharedPreferences prefsMode = getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Create new SharedPreferences instance for selected mode
        SharedPreferences.Editor editorMode = prefsMode.edit(); // Create access variable for editor
        editorMode.putInt("bColor", bColor); // Put received value into editor
        editorMode.putString("farbe", farbe); // Put received value into editor
        editorMode.putString("text", text); // Put received value into editor
        editorMode.apply(); // Save + close instance
        updateGui(); // Update all views
    }
    public void loadModeAndSettings()
    {
        SharedPreferences prefs = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Load saved shared file
        mode = prefs.getString("mode", "A"); // mode or default value: A
        prefsMode = getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Retrieve current prefsMode
        bColor = prefsMode.getInt("bColor", 0); // Load value of background color or default value
        farbe = prefsMode.getString("farbe", "default"); // Load value of color string or default value
        text = prefsMode.getString("text", "default"); // Load value of text string or default value
        updateGui(); // Update all views

        Log.wtf("Farbe: ", farbe); // CORRECT!
        Log.wtf("Modus: ", mode); // CORRECT!
        Log.wtf("Text: ", text); // CORRECT!
    }
}

Danke!

Viele Grüße
 
Hallo
ja alles gut. Hast du doch super gemacht.

zu 1. wie viele update Elemente hast du denn? Denke nicht das du da zwei drei hundert hast.
hier im Beispiel sind es nur zwei. Wenn du viele if und vergleiche machst um deiner Meinung Performances zu sparen. Die brauchen auch Performances das macht für mich keinen sinn. Da habe ich keine Bedenken. Solltest du wirklich Einbußen auf dem Display sehen kannste dir immer noch was überlegen. Zu Z80 8Bit Zeiten war das vielleicht ein Thema.

>Wenn ich z.B. 10 Elemente habe und nur 1 Element verändere, werden die anderen 9 doch umsonst geupdated.
Performance-technisch gesehen ist das eher ineffizient, oder nicht?

bei OOP ist mansches ineffizent aber immer wieder das Rad neu erfinden ist auch doof.
Dann kannst du auch sagen jeder Unterprogramm aufruf ist aus sicht der Performence ein Verlust weil mindesten zwei Maschienen Befehle mehr ausgefürt werden müssen.


Zu 2.
Wird es auch gehen, nur ist es eben so das der View Pager, nicht beim sichtbar werden des Nachbar Fragment die onResume Methode aufruft. Und somit kein Update erfolgen wird.

Entweder du benutzt nicht den ViewPager Tauschst somit die Fragmente selber.
Oder du musst ein paar Tricks benutzen um beim sichtbar werden der Fragmente, das aufrufen onResume Methode anzustoßen . Dafür hatte ich auch schon mal ein Beispiel gegeben.

Der ViewPager ist eigentlich nicht dafür gedacht um gegenseitig habhängige Fragmente zu laden. Seine Stärken spielt er zb. beim Anzeigen von Bildern aus.
Nicht wenn ein Fragment von Daten abhängig ist die erst in dem Nachbar Fragment berechnet werden.
Da er immer mindestens ein Fragment vorlädt. Und selbst wenn du die Tricks benutzt um das ausführen der onResume Methode beim sichtbar werden des Fragment zu erzwingen . Wirst du den Geschwindigkeitsvorteile des Pager verlieren.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: no1Ltan
Hallo,

Danke für die netten Worte!
Sowas motiviert natürlich immer :)

Die Anzahl der Elemente ist nicht so hoch - 10 bis maximal 20.
Wird performancemäßig dann also kein Problem darstellen.
Richtig, die heutige Hardware sollte mit sowas klarkommen.

Also ich hab das eine Beispiel, was aus nur 2 Fragmenten besteht, nochmal ausprobiert.
Mitlerweile habe ich es hinbekommen, dass die Farbe und der Text sofort sichtbar sind.
(Jedoch wieder mit dem preferenceChangeListener).
Leider hänge ich erneut am Modus fest, auch wenn ich beim Moduswechsel die Einstellungen neu lade.
Obwohl die SharedPreferences mit den neuen Werten verändert wird, springt der preferenceChangeListener nicht an.

Das gleiche Problem war ja im Beitrag #9 in diesem Thread.
Dort hatte ich das aber noch anders gemacht und auch nicht die loadModeAndSettings() im preferenceChangeListener aufgerufen.

Beim Moduswechsel passiert also nichts - erst wenn ich das Display kippe.
Der Rest funktioniert genau wie in der GIF-Animation aus Beitrag #9 - nur mit dem Unterschied dass ich 1x nach links wischen muss.

Etwas komisch ist, dass mein preferenceChangeListener einen String key erwartet, aber nichts erhält.
Das Refreshen des Textes und der Farbe funktioniert aber trotzdem.

Fragment1.java
Code:
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import static android.content.Context.MODE_PRIVATE;

public class Fragment1 extends Fragment
{
    // Global variables:
    Button buttonModeA, buttonModeB, buttonModeC, buttonRed, buttonBlue, buttonGreen, buttonNr1, buttonNr2, buttonNr3;
    TextView textViewNr;
    String mode, text;
    int bColor; // Background color for textview
    SharedPreferences prefsMode; // Specific SharedPreferences (modes)

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
    {
        View fragmentOne = inflater.inflate(R.layout.fragment1, container, false); // Link view and layout
        // Link variables to IDs
        buttonModeA = fragmentOne.findViewById(R.id.button_load_a);
        buttonModeB = fragmentOne.findViewById(R.id.button_load_b);
        buttonModeC = fragmentOne.findViewById(R.id.button_load_c);
        buttonRed = fragmentOne.findViewById(R.id.button_red);
        buttonBlue = fragmentOne.findViewById(R.id.button_blue);
        buttonGreen = fragmentOne.findViewById(R.id.button_green);
        buttonNr1 = fragmentOne.findViewById(R.id.button_nr_1);
        buttonNr2 = fragmentOne.findViewById(R.id.button_nr_2);
        buttonNr3 = fragmentOne.findViewById(R.id.button_nr_3);

        loadModeAndSettings(); // Load SharedPreferences
        buttonModeA.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {               
                mode = "A"; // Set mode to A
                saveMode(); // Save selected mode
                loadModeAndSettings();
            }
        });
        buttonModeB.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {             
                mode = "B"; // Set mode to B
                saveMode(); // Save selected mode
                loadModeAndSettings();
            }
        });
        buttonModeC.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "C"; // Set mode to C
                saveMode(); // Save selected mode
                loadModeAndSettings();
            }
        });
        buttonRed.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {               
                bColor = getResources().getColor(R.color.red); // Set background color to red
                saveSettings(); // Save settings
            }
        });
        buttonBlue.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {               
                bColor = getResources().getColor(R.color.blue); // Set background color to blue
                saveSettings(); // Save settings
            }
        });
        buttonGreen.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {               
                bColor = getResources().getColor(R.color.green); // Set background color to green
                saveSettings(); // Save settings
            }
        buttonNr1.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {               
                text = "1"; // Set text to 1
                saveSettings(); // Save settings
            }
        });
        // The same for the other 2 Nrs:
        buttonNr2.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {               
                text = "2"; // Set text to 2
                saveSettings(); // Save settings
            }
        });
        buttonNr3.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {               
                text = "3"; // Set text to 3
                saveSettings(); // Save settings
            }
        });
        return fragmentOne;
    }
    public void saveMode()
    {
        SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Create new SharedPreferences instance
        SharedPreferences.Editor editor = prefs.edit(); // Create access variable for editor
        editor.putString("mode", mode); // Put received value for mode into editor
        editor.apply(); // Save + close instance
    }
    public void saveSettings()
    {
        SharedPreferences prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Create new SharedPreferences instance for selected mode
        SharedPreferences.Editor editorMode = prefsMode.edit(); // Create access variable for editor
        editorMode.putInt("bColor", bColor); // Put received value into editor
        editorMode.putString("text", text); // Put received value into editor
        editorMode.apply(); // Save + close instance
    }
    public void loadModeAndSettings()
    {
        SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Load saved shared file
        mode = prefs.getString("mode", "A"); // mode or default value: A

        prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Retrieve current prefsMode
        bColor = prefsMode.getInt("bColor", 0); // Load value of background color or default value
        text = prefsMode.getString("text", "default"); // Load value of text string or default value
    }
}

Fragment2.java:
Code:
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import static android.content.Context.MODE_PRIVATE;

public class Fragment2 extends Fragment
{
    // Global variables:
    TextView textViewNr; // Visual feedback for color and nr.
    String mode, text; // Mode for SharedPreferences and text nr. for textViewNr
    int bColor; // Background color for textView
    SharedPreferences prefsMode; // Specific SharedPreferences (modes)
    private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener; // Access variable for SharedPreferencesChangeListener

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
    {
        View fragmentTwo = inflater.inflate(R.layout.fragment2, container, false); // Link view and layout
        textViewNr = fragmentTwo.findViewById(R.id.text_view_nr); // Link variable to ID
        loadModeAndSettings(); // Load SharedPreferences
        preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() // Check if SharedPreferences have been changed
        {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
            {
                loadModeAndSettings(); // Load settings and refresh views if anything has been changed
            }
        };
        prefsMode.registerOnSharedPreferenceChangeListener(preferenceChangeListener); // Apply changes
        return fragmentTwo;
    };
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (preferenceChangeListener != null)
        {
            prefsMode.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
        }
    }
    public void loadModeAndSettings() // Load mode and its settings
    {
        SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Load saved shared file
        mode = prefs.getString("mode", "A"); // mode or default value: A

        prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Retrieve current prefsMode
        bColor = prefsMode.getInt("bColor", 0); // Load value of background color or default value
        text = prefsMode.getString("text", "default"); // Load value of text string or default value
        updateGui(); // Update all views
    }
    public void updateGui() // Refresh views
    {
        textViewNr.setBackgroundColor(bColor); // Update background color of textViewMode
        textViewNr.setText(text); // Update text of textViewMode
    }
}


Grüße
 
Hallo
Also du setzt zwar den Listner auf die Variable prefsMode zeile 36.
Aber initialisieren tust du die Variable nicht bzw. erst später in Zeile 53 in der
loadModeAndSettings() Methode.
Somit kann der Listner nicht aufgerufen werden er weis ja noch gar nicht worauf er hören soll.
bzw. Welcher deiner pref Datein er beobachten soll.

Etwas komisch ist, dass mein preferenceChangeListener einen String key erwartet, aber nichts erhält.
Das Refreshen des Textes und der Farbe funktioniert aber trotzdem.

Der Listner die Methode "onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)" erwartet keine Werte( String), sondern ihm werden die Parameter so zusagen vom System dir mitgegeben.
Denn das ist ja eine Callback Methode die vom System aufgerufen wird, und du hast sie Überschrieben um sie nutzen zu können. Grundlagen OOP.
Somit könnstest du sie im listner benutzen brauchst du aber in deinem fall nicht.

Ist das gleiche wie bei einen onClick das "View" was übergeben wird.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: no1Ltan
Danke für den Hinweis, aber um ehrlich zu sein weiß ich dennoch nicht, wie ich das Problem beheben kann.
Die loadModeAndSettings(), die auch für das Laden des Modes zuständig ist, wird doch vorm preferenceChangeListener aufgerufen.
Außerdem auch noch im preferenceChangeListener.

Was muss ich da noch zusätzlich machen?
 
Ich dachte das du selber drauf kommst.
Du initialisiert zwar den Listner für deine drei Pref Dateien (A,B,C), aber nicht für die Modus Datei.
Somit kann der Listner nicht beim Klick bzw. Änderung des Modus und somit Änderung der Pref-Modus Datei aufgerufen werden.
Du hast ja schon richtig den Listner in eine Variable gepackt um Ihn auch mehrfach zu benutzen dann mache das doch auch.

Habe deinen Code etwas umgebaut nicht getestet sollte aber gehen.


Code:
public class Fragment2 extends Fragment
{
    // Global variables:
    TextView textViewNr; // Visual feedback for color and nr.
    String mode, text; // Mode for SharedPreferences and text nr. for textViewNr
    int bColor; // Background color for textView
    SharedPreferences prefsMode, prefsModus; // Specific SharedPreferences (modes)
    private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener; // Access variable for SharedPreferencesChangeListener

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
    {
        View fragmentTwo = inflater.inflate(R.layout.fragment2, container, false); // Link view and layout
        textViewNr = fragmentTwo.findViewById(R.id.text_view_nr); // Link variable to ID

        prefsModus = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Load saved shared file
        prefsModus.registerOnSharedPreferenceChangeListener(preferenceChangeListener);
           
        loadModeAndSettings(); // Load SharedPreferences
        prefsMode.registerOnSharedPreferenceChangeListener(preferenceChangeListener); // Apply changes
        preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() // Check if SharedPreferences have been changed
        {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
            {
                loadModeAndSettings(); // Load settings and refresh views if anything has been changed
            }
        };

        return fragmentTwo;
    };
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (preferenceChangeListener != null)
        {
            prefsMode.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
        }
    }
    public void loadModeAndSettings() // Load mode and its settings
    {
        mode = prefsModus.getString("mode", "A"); // mode or default value: A

        prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Retrieve current prefsMode
      
        bColor = prefsMode.getInt("bColor", 0); // Load value of background color or default value
        text = prefsMode.getString("text", "default"); // Load value of text string or default value
        updateGui(); // Update all views
    }
    public void updateGui() // Refresh views
    {
        textViewNr.setBackgroundColor(bColor); // Update background color of textViewMode
        textViewNr.setText(text); // Update text of textViewMode
    }
}
 
Zuletzt bearbeitet:
Danke, aber leider funktioniert es nicht.
Nachdem ich auf einen Modus-Button klicke, passiert nichts.
Danach funktionieren auch die anderen Buttons nicht mehr.
(Die Views aktualisieren sich nicht - erst nach Kippen des Displays.)

Hab die prefsModus als globale Variable hinzugefügt, die 2 prefsModus-Zeilen hinzugefügt
und die prefsMode.registerOnSharedPreferenceChangeListener(preferenceChangeListener) verschoben.
(Genau wie in deinem Code).

Grüße
 
Dann schreibe mal die beiden Registrierungen für den listner nach der listner variablen. wie du am Anfang. Da dies ja nur eine variable ist und keine Methode wird sie zu dem Zeitpunkt noch nicht existieren.
Sory mein Fehler sagte aber nicht getestet.

wenn du willst kannste es auch mit zwei Listern machen.
Code:
public class Fragment2 extends Fragment
{
    // Global variables:
    TextView textViewNr; // Visual feedback for color and nr.
    String mode, text; // Mode for SharedPreferences and text nr. for textViewNr
    int bColor; // Background color for textView
    SharedPreferences prefsMode, prefsModus; // Specific SharedPreferences (modes)
    private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener; // Access variable for SharedPreferencesChangeListener

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
    {
        View fragmentTwo = inflater.inflate(R.layout.fragment2, container, false); // Link view and layout
        textViewNr = fragmentTwo.findViewById(R.id.text_view_nr); // Link variable to ID
        preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() // Check if SharedPreferences have been changed
        {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
            {
                loadModeAndSettings(); // Load settings and refresh views if anything has been changed
            }
        };
       
        SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener2 = new SharedPreferences.OnSharedPreferenceChangeListener() 
        {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
            {
                loadModeAndSettings(); // Load settings and refresh views if anything has been changed
                               
            }
        };
       
        prefsModus = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Load saved shared file
        prefsModus.registerOnSharedPreferenceChangeListener(preferenceChangeListener2);
         
        loadModeAndSettings(); // Load SharedPreferences
        prefsMode.registerOnSharedPreferenceChangeListener(preferenceChangeListener); // Apply changes
       

        return fragmentTwo;
    };
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (preferenceChangeListener != null)
        {
            prefsMode.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
        }
    }
    public void loadModeAndSettings() // Load mode and its settings
    {
        mode = prefsModus.getString("mode", "A"); // mode or default value: A

        prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Retrieve current prefsMode
     
        bColor = prefsMode.getInt("bColor", 0); // Load value of background color or default value
        text = prefsMode.getString("text", "default"); // Load value of text string or default value
        updateGui(); // Update all views
    }
    public void updateGui() // Refresh views
    {
        textViewNr.setBackgroundColor(bColor); // Update background color of textViewMode
        textViewNr.setText(text); // Update text of textViewMode
    }
}
 
Zuletzt bearbeitet:

Ähnliche Themen

R
  • RalfKahl
Antworten
10
Aufrufe
300
RalfKahl
R
R
  • Robby1950
2
Antworten
23
Aufrufe
1.016
Robby1950
R
5
Antworten
22
Aufrufe
1.421
590239
5
Zurück
Oben Unten