Wert beim Start der App aus SharedPreferences auslesen

Ok, ich habe das mal mit den 2 Listenern probiert.
Allerdings ist anscheinend das Problem, dass nur 1 Sache funktioniert.
Entweder der Moduswechsel läuft oder das Ändern der Farbe bzw. des Textes.
Ändere ich aber den Modus und versuche dann Farbe/Text zu ändern, geht es nicht.

Ebenso umgekehrt.
 
Ich überlege gerade, ob es nicht sinnvoller ist, beim Moduswechsel einen echten Refresh durchzuführen.
Bei den anderen Buttons funktioniert das mit dem SharedPreferencesListener super.
(Dafür kann ich ihn ja weiterhin verwenden - nur eben nicht für den Moduswechsel.)

Ich habe jetzt einige Codes ausprobiert, aber bisher keinen Erfolg gehabt.
Als Erstes habe ich in dem Fragment2 (was ich ja refreshen will), diese Zeile hinzugefügt:
Code:
private static final String TAG = "fragment2";
(Im gleichen Block, in dem sich auch die anderen globalen Variablen befinden.)

Im Fragment1 habe ich in der Click-Methode von Mode A nun verschiedene Variationen ausprobiert:
Code:
        Fragment frg = null;
        final FragmentTransaction ft = getChildFragmentManager().beginTransaction();
        ft.addToBackStack("fragment2");
        frg = getChildFragmentManager().findFragmentByTag("fragment2");
        ft.detach(frg);
        ft.attach(frg);
        ft.commit();


Code:
        Fragment frg = null;
        final FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.addToBackStack("fragment2");
        frg = getFragmentManager().findFragmentByTag("fragment2");
        ft.detach(frg);
        ft.attach(frg);
        ft.commit();


Code:
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.detach("fragment2").attach("fragment2").commit();


Code:
        Fragment frg = null;
        frg = getActivity().getSupportFragmentManager().findFragmentByTag("fragment2");
        final FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
        ft.detach(frg);
        ft.attach(frg);
        ft.commit();

Leider führten alle Variationen zu Abstürzen, sobald ich auf Mode A klickte.
"java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.Fragment.setNextAnim(int)' on a null object reference"
In einigen Variationen wurden bestimmte Begriffe gelb markiert und es kam Bereits der Hinweis mit dem Null-Pointer

In der 1. Variation (mit dem getChildFragmentManager()) kam kein Hinweis bezüglich eines Null-Pointers.
Funktioniert hat es dennoch nicht.

Man ist das vielleicht schwer :1f612:

Viele Grüße
 
Also wenn du nur die zwei fragmente hast und auch nicht mehr willst kannst du auch eine callback Methode erstellen wo du dann das update machst.
Oder du erstellst eine static Methode die du vom frag 2 aus aufrufst wenn ein Button gedrückt wird.
 
Ich schaue mir das mit den callBack-Methoden mal an, Danke für den Tipp.
Was genau meinst du aber mit "Nur zwei Fragmente und auch nicht mehr"?
Wenn ich z.B. ein drittes Fragment habe wird das dann nicht mehr gehen?

Für mich ist es immer sicherer, wenn nach oben noch ein bisschen Luft ist.
Mal ganz anders formuliert:
Lieber eine Doppel-Garage bauen obwohl man nur 1 Auto hat, da man vielleicht mal ein 2. Auto reinstellen will.
(Oder den Platz anderweitig nutzen will.)

Diese Denkweise versuche ich auch beim Coden zu beachten.
Stichwort: Ausbaufähigkeit/Reserve :)

Grüße
 
Das das ganze auch mit dem listner funktioniert .ist ja nur weil der viewpager die benachbarten Fragmente schon vorgeladen hat. Somit ist zur Laufzeit von Fragment 2 das erste auch schon geladen und läuft quasi schon. Somit kann auch der listner deine viev Elemente des Fragment 1 setzen. Wenn du ein drittes fragment hast ist das erste Fragment zum Zeitpunkt der Sichtbarkeit des dritten nicht geladen und somit würde wahrscheinlich der listner gar nicht aufgerufen werden. Und wenn doch würde das setzen der view Elemente ein Fehler verursachen und die App wird wohl abstürzen.

Wie ich schon mal sagte würde ich bei sich gegenseitig bedingten Fragmente nicht den Prager benutzen. Ich würde es von hand machen. Somit wir nichts vorgeladen und die Orgasmus wird auch b3im sichtbar werden durchlaufen.

Wenn du es unbedingt mit dem Pager machen willst musst du sicher stellen das die onResume oder eine andere Methode beim sichtbar werden aufgerufen wird, und dort kannst du dein Update machen. Das ist die einfachste und sicherste Möglichkeit. Habe ich aber nun auch mehrfach gesagt.
Dann teste und profitiert es aus, wist ja sehen was passiert.
 
Orgasmus? :1f633:

Ok, hab's jetzt gelöst, allerdings habe ich wohl von allen Möglichkeiten die Schlechteste gewählt.

Hab ganz einfach eine DummyActivity erzeugt, die ich beim Moduswechsel aufrufe und sofort schließe.
(Man merkt - zumindest auf dem Emulator - absolut gar nichts von diesem Vorgang.)
In Fragment1 sieht die saveMode-Methode nun so hier aus:
Code:
    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

        Intent intent = new Intent(getActivity(), DummyActivity.class); // Create intent for running DummyActivity
        getActivity().startActivity(intent); // Run DummyActivity
    }

Die DummyActivity besteht nur aus diesem Codeblock:
Code:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class DummyActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dummy);
        this.finish(); // Close this activity
    }
}

Im Fragment2 hab ich dann 95% des Codes, der sich in der onCreateView befand, in die onResume gepackt.
In der onCreateView befinden sich nur noch:
View fragmentTwo = inflater.inflate(R.layout.fragment2, container, false); // Link view and layout
return fragmentTwo;

Es funktioniert einwandfrei, auch wenn ich es ehrlich gesagt nicht das ist, was ich mir vorgestellt hab.

P.S.
In Fragment1 schreibt mir Android Studio bei allen diesen Zeilen:
SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Create new SharedPreferences instance
dass getSharedPreferences eine NullPointerException erzeugen könnte.
Es funktioniert zwar, aber ist wohl doch ein Spiel mit dem Feuer.

Grüße
 

Ähnliche Themen

R
  • RalfKahl
Antworten
10
Aufrufe
301
RalfKahl
R
R
  • Robby1950
2
Antworten
23
Aufrufe
1.022
Robby1950
R
5
Antworten
22
Aufrufe
1.422
590239
5
Zurück
Oben Unten