1. Mitglieder surfen ohne Werbung auf Android-Hilfe.de! ✔ Jetzt kostenlos Mitglied in unserer Community werden.
  1. no1Ltan, 10.09.2018 #1
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    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
     
  2. jogimuc, 10.09.2018 #2
    jogimuc

    jogimuc Erfahrener Benutzer

    Hi du progmmierst in Java nicht in C.
    String Vergleich in Java.
    If (st1.equals(skt2))
     
    no1Ltan bedankt sich.
  3. no1Ltan, 10.09.2018 #3
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    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
     
  4. jogimuc, 10.09.2018 #4
    jogimuc

    jogimuc Erfahrener Benutzer

    Dann überlege mal selber was bei deiner Variante passirt.
    String ist in Java eine Klasse und nicht wie in C ein datatentyp.
     
  5. no1Ltan, 13.09.2018 #5
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    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
     
  6. jogimuc, 13.09.2018 #6
    jogimuc

    jogimuc Erfahrener Benutzer

    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: 13.09.2018
  7. no1Ltan, 13.09.2018 #7
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    Hallo jogimuc,

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

    [​IMG]

    [​IMG]

    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.
     
  8. jogimuc, 13.09.2018 #8
    jogimuc

    jogimuc Erfahrener Benutzer

    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.



    -- Dieser Beitrag wurde automatisch mit dem folgenden Beitrag zusammengeführt --
    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: 13.09.2018
    no1Ltan bedankt sich.
  9. no1Ltan, 11.10.2018 #9
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    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!

    [​IMG]
     
  10. jogimuc, 11.10.2018 #10
    jogimuc

    jogimuc Erfahrener Benutzer

    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.
     
    no1Ltan bedankt sich.
  11. reallord, 11.10.2018 #11
    reallord

    reallord Android-Hilfe.de Mitglied

    Bei Zahlen und Farbe rufst Du saveSettings(); auf, aber bei Buchstaben saveMode();?

    Warum verwendest Du denn 2 sharedPrefs?
     
  12. jogimuc, 11.10.2018 #12
    jogimuc

    jogimuc Erfahrener Benutzer

    @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.
     
  13. no1Ltan, 12.10.2018 #13
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    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
     
  14. jogimuc, 12.10.2018 #14
    jogimuc

    jogimuc Erfahrener Benutzer

    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.

    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: 12.10.2018
    no1Ltan bedankt sich.
  15. no1Ltan, 12.10.2018 #15
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    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
     
  16. jogimuc, 12.10.2018 #16
    jogimuc

    jogimuc Erfahrener Benutzer

    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.

    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: 12.10.2018
    no1Ltan bedankt sich.
  17. no1Ltan, 16.10.2018 #17
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    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?
     
  18. jogimuc, 16.10.2018 #18
    jogimuc

    jogimuc Erfahrener Benutzer

    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: 16.10.2018
  19. no1Ltan, 17.10.2018 #19
    no1Ltan

    no1Ltan Threadstarter Android-Hilfe.de Mitglied

    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
     
  20. jogimuc, 17.10.2018 #20
    jogimuc

    jogimuc Erfahrener Benutzer

    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: 17.10.2018
Die Seite wird geladen...
Ähnliche Themen Forum Datum
Eigene App auf Smartwatch installieren klappt nicht Android App Entwicklung 08.11.2018
In App Käufe programmieren Android App Entwicklung 04.11.2018
mindest API ist 26?! Android App Entwicklung 01.11.2018
Android App - Objekt bewegt sich nach Handyneigung Android App Entwicklung 30.10.2018
Wie float wert von android App an desktop Applikation per Bluetooth senden? Android App Entwicklung 29.10.2018
Neigungssensor ansprechen und wert ausgeben in App Android App Entwicklung 14.10.2018
MIT AppInventor App erstellen um PDFs zu öffnen, problem Android App Entwicklung 10.10.2018
Kosten/ Aufwand für ne Android App für Vereinsaufgaben? Android App Entwicklung 08.10.2018
Welches Tut/Buch/... für meine App-Idee? Android App Entwicklung 01.10.2018
App startet nicht - Wie, die Ursache finden? Android App Entwicklung 18.09.2018
Du betrachtest das Thema "Wert beim Start der App aus SharedPreferences auslesen" im Forum "Android App Entwicklung",
  1. Android-Hilfe.de verwendet Cookies um Inhalte zu personalisieren und dir den bestmöglichen Service zu gewährleisten. Wenn du auf der Seite weitersurfst stimmst du der Cookie-Nutzung zu.  Ich stimme zu.