App startet nicht - Wie, die Ursache finden?

N

no1Ltan

Fortgeschrittenes Mitglied
Threadstarter
Hallo allerseits,

wenn ich in einer komplexen App eine bestimmte Funktionalität nicht umsetzen/einbinden kann,
erstelle ich meist eine neue kleine App, um mich nur auf diesen 1 Punkt zu konzentrieren.
(Ist auch für die anderen dann einfacher und schneller lesbar, da kaum Code vorhanden ist.)

Jedenfalls habe ich in letzter Zeit immer wieder das Problem, dass selbst diese Mini-Test-Apps nicht starten.
Obwohl ich keinen Fehler in den Layouts oder den java-Codes sehe, hab ich keine Chance, die App zum Laufen zu bekommen.

Diese App besteht aus 1 Activity und 2 Fragmenten.
Ich habe sogar extra noch zusätzlich Codezeilen entfernt.

MainActivity.java
Code:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity
{
    ViewPager vp;
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewPager vp = findViewById(R.id.vp);
        SetUpViewPager(vp);
    }
    public void SetUpViewPager(ViewPager viewpage)
    {
        MyViewPagerAdapter Adapter = new MyViewPagerAdapter(getSupportFragmentManager());
        Adapter.AddPageFragment(new Fragment1(), "Fragment1"); // Load pages inside of ViewPager
        Adapter.AddPageFragment(new Fragment2(), "Fragment2");
        viewpage.setAdapter(Adapter);
    }
    public class MyViewPagerAdapter extends FragmentPagerAdapter
    {
        private List<Fragment> MyFragment = new ArrayList<>();
        private List<String> MyPageTitle = new ArrayList<>();

        public MyViewPagerAdapter(FragmentManager manager)
        {
            super(manager);
        }
        public void AddPageFragment(Fragment Frag, String Title)
        {
            MyFragment.add(Frag);
            MyPageTitle.add(Title);
        }
        @Override
        public Fragment getItem(int i)
        {
            return MyFragment.get(i);
        }
        @Nullable
        @Override
        public CharSequence getPageTitle(int position)
        {
            return MyPageTitle.get(position);
        }
        @Override
        public int getCount()
        {
            return 2; // 2 pages total
        }
    }
}
Fragment1.java:
Code:
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;

public class Fragment1 extends Fragment
{
    @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
        return fragmentOne;
    }
}
Fragment2.java:
Code:
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;

    @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
        return fragmentTwo;
    }
}
activity_main.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <FrameLayout
        android:id="@+id/frame_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </FrameLayout>

</android.support.design.widget.CoordinatorLayout>
fragment1.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="64dp"
        android:text="Write 1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="48dp"
        android:text="Write 2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button_1" />
</android.support.constraint.ConstraintLayout>
fragment2.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:textSize="30sp"
        android:text="TextView"
        android:background="@color/colorPrimaryDark"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
content_main.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/vp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main"/>
strings.xml
Code:
<resources>
    <string name="app_name">RefreshFragment</string>
</resources>
styles.xml
Code:
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

</resources>
AndroidManifest.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.USER.refreshfragment">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
build.gradle
Code:
apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.USER.refreshfragment"
        minSdkVersion 23
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
"Build completed successfully" heißt es.
Allerdings erscheint beim Starten der App immer die Meldung: "RefreshFragment has stopped."

Was kann ich als "normaler User" denn tun, um den Fehler ausfindig zu machen?
Kann der Debugger in diesem Fall helfen?
Oder ist das einfach nur ein weiterer typischer Anfängerfehler?

P.S. Wie gesagt, auch mit den Buttons und TextViews im Code tut sich nichts.

Danke für jede Hilfe!
 
D

deek

Stammgast
Ganz wichtig ist das Logcat (unten anwählbar)
Dort wird dann in den meisten Fällen irgendwo ein Stacktrace sein, der die genau die Exception und die Codestellen zeigt wo es schief geht.

Ich habe deinen Code jetzt nicht angeschaut.
 
J

jogimuc

Erfahrenes Mitglied
Hallo das dürfte eigentlich kein Fehler sein sondern ein Hinweise das kein Refresh des Fragments erfolgt.
Denn du hast nur zwei Fragmente und es werden immer die Nachbarn vorgeladen. In deinen Fall ein mal und danach nicht mehr. Du hast nur zwei Fragmente die sich gegenseitig geladen haben.
Jetzt haben wir genau das was ich dir schon in dem Beitrag von dir „Wie viele Klassen und Layouts brauche ich für meine App?“ Post 30 gesagt habe.
Denn es wird eben nicht beim zurück swipen zum Nachbar-Fragment die onCreateView, onResume … durchlaufen.

ViewPager Update Fragment beim Swipe | germanylandofinnovation.com
 
Zuletzt bearbeitet:
N

no1Ltan

Fortgeschrittenes Mitglied
Threadstarter
@deek:
Das mit dem Logcat schaue ich mir nochmal genauer an.
Logcat ist bei mir an, aber bisher hab ich nur "Bahnhof" verstanden.
Ich gucke das nochmal genau an.

@jogimuc:
Du hast Recht, aber der Code, den ich hier gepostet hab, ist auch der tatsächliche.
Es wird also nichts refreshed.
Der Fehler muss irgendwo in der Basis liegen.

Und ja, ich erinnere mich an deinen Beitrag :)
 
D

deek

Stammgast
@jogimuc RefreshFragment ist der Name der App "RefreshFragment has stopped" ist also durchaus die Fehlermeldung vom System, dass die App abgestürzt ist. Es sollte also ein Stacktrace im Log zu finden sein.

@no1Ltan Du musst wohl oder übel damit klarkommen, neben dem Debugger ist es das Hauptwerkzeug zur Fehlersuche. Schränke die Ausgabe am besten auf deine App ein ("Only selected Application" rechts), dann ist es schon deutlich weniger.

ein Stacktrace sieht so aus, ist also normalerweise leicht zu finden im Log:
Code:
09-19 09:37:47.544 3991-4390/? E/AsyncOpDispatcher: Could not get module info from current context.
    java.lang.IllegalStateException: Unable to get current module info in ModuleManager created with non-module Context
        at com.google.android.chimera.config.ModuleManager.getCurrentModule(:com.google.android.gms@13280021@13.2.80 (040408-211705629):2)
        at wwj.b(:com.google.android.gms@13280021@13.2.80 (040408-211705629):1)
        at wwj.<init>(:com.google.android.gms@13280021@13.2.80 (040408-211705629):8)
        at wwj.a(:com.google.android.gms@13280021@13.2.80 (040408-211705629):9)
        at com.google.android.gms.icing.mdd.service.DataDownloadChimeraService.a(:com.google.android.gms@13280021@13.2.80 (040408-211705629):14)
        at wwd.a(:com.google.android.gms@13280021@13.2.80 (040408-211705629):26)
        at pmz.a(:com.google.android.gms@13280021@13.2.80 (040408-211705629):46)
        at pnh.a(:com.google.android.gms@13280021@13.2.80 (040408-211705629):110)
        at pbi.run(:com.google.android.gms@13280021@13.2.80 (040408-211705629):8)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.os.HandlerThread.run(HandlerThread.java:65)
 
J

jogimuc

Erfahrenes Mitglied
Hi also deine App würde Starten wenn du auch die Design LiB mit einbinden würdest.

implementation 'com.android.support:design:27.1.1'

Hatten wir glaube auch schon mal das es fast immer sinnvoll ist die Design Lib mit einzubinden.
Bei der Gelegenheit kannst du auch gleich die neusten libs einbinden.




dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:design:27.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

@desk der Debugger hätte hier wol auch nicht so viel geholfen.
Du hast scheinbar aus dem Post ein Projekt erstellt.

@no1Ltan schön das du den Code Postest. Da du sowieso den gesamten Code gepostet hast.
Damit man es nachvollziehen kann. Was sehr gut ist . Besser und noch einfacher für uns wäre wenn du das Projekt gleich zb. auf Github legst. Dann könnten wir gleich das Projekt laden und testen. Wir müssen dann nicht erst durch Copy Paste uns aus den Post ein Projekt erstellen.
Aber in diesen Fall war es ein recht einfacher Fehler der hätte mir gestern auch auffallen müssen.
Habe es arber auch nur am Handy angesehen und da ist die Übersicht schlecht.

Wie ich aber sagte ein Refresh wird nicht erfolgen den musst du selber anstossen.
 
Zuletzt bearbeitet:
N

no1Ltan

Fortgeschrittenes Mitglied
Threadstarter
Ich danke euch beiden für eure Hilfe!

Gut, nachdem ich die build.gradle (Module: app) bearbeitet habe, funktioniert es.
Ist es sinnvoll, diesen gesamten Code-Block zu archivieren und ihn dann in neuen Apps einzufügen,
damit nicht wieder der gleiche Fehler auftritt?

Ich habe mal absichtlich die implementation 'com.android.support:design:27.1.1 auskommentiert.
Das Programm stürzt wieder ab (logisch), aber mittels LogCat denke ich, dass ich den Fehler hätte lokalisieren können.
Habe sowohl die Option "Show only selected application" als auch "Error" ausgewählt und vor App-Start den Log geleert.

Sind weniger als 80 Zeilen, aber interessant sind diese hier:
Code:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.USER.refreshfragment/com.example.USER.refreshfragment.MainActivity}: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class android.support.design.widget.AppBarLayout

Caused by: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class android.support.design.widget.AppBarLayout
     Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class android.support.design.widget.AppBarLayout
     Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.design.widget.AppBarLayout" on path: DexPathList[[zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/base.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_dependencies_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_resources_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_0_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_1_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_2_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_3_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_4_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_5_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_6_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_7_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_8_apk.apk", zip file "/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.example.USER.refreshfragment-raHUyGsGH2X4_siF1AGy_g==/lib/x86, /system/lib, /vendor/lib]]
Kurz gefasst schlussfolgere ich:
Wenn ich mir zu 99% sicher bin, dass es kein funktionales Problem ist und die App nicht mal startet,
ist irgendwas mit dem Design verkehrt.

Danke nochmals!
 
N

no1Ltan

Fortgeschrittenes Mitglied
Threadstarter
Zum Thema Fragment refreshen:
Habe es hinbekommen (natürlich mit Hilfe)!
Falls es euch interessiert:

Fragment1:
Code:
import android.content.Context;
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.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class Fragment1 extends Fragment
{
    String text; // Text of textViewValue
    int bColor; // Background color of constraintLayout
    SharedPreferences prefs; // Variable for SharedPreferences
    @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:
        Button button1 = fragmentOne.findViewById(R.id.button_1); // Link variable to ID
        Button button2 = fragmentOne.findViewById(R.id.button_2); // Link variable to ID
        Button buttonColorRed = fragmentOne.findViewById(R.id.button_color_red); // Link variable to ID
        Button buttonColorBlue = fragmentOne.findViewById(R.id.button_color_blue); // Link variable to ID
        //-----------------------
        loadPreferences(); // Load SharedPreferences
        button1.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                text = "1";
                savePreferences();
            }
        });
        button2.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                text = "2";
                savePreferences();
            }
        });
        buttonColorRed.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.red);
                savePreferences();
            }
        });
        buttonColorBlue.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.blue);
                savePreferences();
            }
        });
        return fragmentOne;
    }
    public void savePreferences()
    {
        SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE); // Create new SharedPreferences instance
        SharedPreferences.Editor editor = prefs.edit(); // Create variable for SharedPreferences
        editor.putString("text", text); // Write text coming from button inside of editor
        editor.putInt("bcolor", bColor); // Write background color coming from button inside of editor
        editor.apply(); // Apply and close SharedPreferences instance
        Log.wtf("Text is: ", text); // Check if text is correct - yes, it's correct
    }
    public void loadPreferences()
    {
        prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE); // Load SharedPreferences
        bColor = prefs.getInt("bcolor", 0); // Retrieve bColor from SharedPreferences
        text = prefs.getString("text", "0"); // Retrieve text from SharedPreferences
    }
}
Fragment2:
Code:
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.constraint.ConstraintLayout;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Fragment2 extends Fragment
{
    String text; // Text of textViewValue
    int bColor; // Background color of constraintLayout
    SharedPreferences prefs; // Variable for SharedPreferences
    private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener; // 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
        final TextView textViewValue = fragmentTwo.findViewById(R.id.text_view); // Link variable to ID
        final ConstraintLayout constraintLayout = fragmentTwo.findViewById(R.id.constraint_layout); // Link variable to ID
        loadPreferences(); // Load SharedPreferences
        textViewValue.setText(text); // Update text in textViewValue
        constraintLayout.setBackgroundColor(bColor); // Update background color of constraintLayout
        preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() // Check if SharedPreferences have been changed recently
        {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
            {
                switch (key) // Check, which key has been changed
                {
                    case "text":
                        text = sharedPreferences.getString("text", "0"); // Load value of text from SharedPreferences
                        textViewValue.setText(text); // Update text in textViewValue
                    case "bcolor":
                        bColor = sharedPreferences.getInt("bcolor", getResources().getColor(R.color.white)); // Load value of bColor from SharedPreferences
                        constraintLayout.setBackgroundColor(bColor); // Update background color of constraintLayout
                    break;
                }
            }
        };
        prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener); // Apply changes
        return fragmentTwo;
    };
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (preferenceChangeListener != null)
        {
            prefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
        }
    }
    public void loadPreferences()
    {
        prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", Context.MODE_PRIVATE); // Load SharedPreferences
        text = prefs.getString("text", "0"); // Retrieve text from SharedPreferences
        bColor = prefs.getInt("bcolor", 0); // Retrieve bColor from SharedPreferences
    }
}
Beim Klick auf einen oder mehrere Buttons in Fragment1 wird sofort das 2. Fragment aktualisiert.
Auch nach Drehen des Bildschirms und Neustarten der App ist noch alles da.

Hättet ihr allgemein Verbesserungsvorschläge in den Codes?
Habe übrigens absichtlich globale Variablen verwendet, da ich sonst in Fragment1 2 Methoden gebraucht hätte.
Methode 1 erwartet den bColor-Wert, Methode 2 den Text-Wert.
Bei globalen Variablen kann ich mir die Übergabe der Werte (direkt an die Methode) sparen.

Grüße
 
J

jogimuc

Erfahrenes Mitglied
Ja ok so kann man es auch machen mit einem nSharedPreferenceChanged Listner. Nur ist das kein richtiges Refresh ist. Von F1 zu F2 hast du einen listner von F2 zu F1 keinen.

Nur was machst du wenn du zb. beim Aufruf von F1 aus F2 eine Animation starten willst dann geht der Trick mit den Präferenzes nicht.

Wie gesagt mit einem Refresh hat das nichts zu tunen und geh auch nur weil beide Fragmente geladen sind. Was machst du wenn es mehere möglichkeiten gibt die Fragmente aufzurufen und du nicht genau weist von wo aus dein Fragment aufgerufen wird.

Soll keine Kritik sein nur dir erläutern das dies kein echter Refresh ist.
 
Zuletzt bearbeitet:
Oben Unten