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

    no1Ltan Threadstarter Erfahrener Benutzer

    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!
     
  2. deek, 18.09.2018 #2
    deek

    deek Android-Experte

    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.
     
  3. jogimuc, 18.09.2018 #3
    jogimuc

    jogimuc Erfahrener Benutzer

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

    no1Ltan Threadstarter Erfahrener Benutzer

    @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 :)
     
  5. deek, 19.09.2018 #5
    deek

    deek Android-Experte

    @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)
    
     
    no1Ltan bedankt sich.
  6. jogimuc, 19.09.2018 #6
    jogimuc

    jogimuc Erfahrener Benutzer

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

    no1Ltan Threadstarter Erfahrener Benutzer

    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!
     
  8. no1Ltan, 24.09.2018 #8
    no1Ltan

    no1Ltan Threadstarter Erfahrener Benutzer

    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
     
  9. jogimuc, 24.09.2018 #9
    jogimuc

    jogimuc Erfahrener Benutzer

    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: 24.09.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
Wert beim Start der App aus SharedPreferences auslesen Android App Entwicklung 10.09.2018
Du betrachtest das Thema "App startet nicht - Wie, die Ursache finden?" 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.