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 Android-Hilfe.de Mitglied

    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 Android-Hilfe.de Mitglied

    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 Android-Hilfe.de Mitglied

    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 Android-Hilfe.de Mitglied

    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
Die Seite wird geladen...
Ähnliche Themen Forum Datum
App startet nicht - Wie, die Ursache finden? Android App Entwicklung Dienstag um 16:56 Uhr
Datenschutzerklärung bei eigener App (ohne Erhebung von Daten) Android App Entwicklung 30.08.2018
Wie viele Klassen und Layouts brauche ich für meine App? Android App Entwicklung 05.08.2018
TextView wert übergeben Android App Entwicklung 28.06.2018
Android Studio - App stürtzt immer ab Android App Entwicklung 24.06.2018
Bluetooth LE mit MIT App Inventor 2 Android App Entwicklung 15.06.2018
Daten für eine Stundenplan-App Android App Entwicklung 23.05.2018
App wird nach start sofort beendet! Android App Entwicklung 21.05.2018
Service stoppt wenn App geschlossen wird Android App Entwicklung 16.05.2018
Mit Webview.findallasync ein Wert überprüfen -Hilfe Android App Entwicklung 29.04.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.