2

I have created a Android Studio project and I have inplemented a Navigation Drawer based on the Github project by (Mike Penz)

The drawer is working fine and I'm able to navigate to menu fragments just fine.

I only have one issue that I need help with.

My (SettingsFragment) extends (PreferenceFragment) but from my dawer I'm not able to navigate settings fragment. It is just crashing the app.

SettingsFragment.Java

public class SettingsFragment extends PreferenceFragment {


    public SettingsFragment() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);
    }

}

Below is the code that navigates to diffirent fragments

MainActivity.Java

...

public void selectDrawerItem(int ItemId,IDrawerItem drawerItem) {
        // Create a new fragment and specify the fragment to show based on nav item clicked
        Fragment fragment = null;
        Class fragmentClass;
        switch(ItemId) {
            case 1:
                fragmentClass = OneFragment.class;
                break;
            case 2:
                fragmentClass = TwoFragment.class;
                break;
            case 3:
                fragmentClass = ThreeFragment.class;
                break;
            case 4:
                fragmentClass = FourFragment.class;
                break;
            case 5:
                fragmentClass = SettingsFragment.class;
                break;
            default:
                fragmentClass = OneFragment.class;
        }
        try {
            fragment = (Fragment) fragmentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
        result.closeDrawer();
    }

...

The LogCat output

12-19 20:32:06.619 10651-10651/com.company.app W/System.err: java.lang.ClassCastException: com.company.app.fragments.SettingsFragment cannot be cast to android.support.v4.app.Fragment
12-19 20:32:06.619 10651-10651/com.company.app W/System.err:     at com.company.app.activities.MainActivity.selectDrawerItem(MainActivity.java:259)
12-19 20:32:06.620 10651-10651/com.company.app W/System.err:     at com.company.app.activities.MainActivity$3.onItemClick(MainActivity.java:225)
12-19 20:32:06.620 10651-10651/com.company.app W/System.err:     at com.mikepenz.materialdrawer.DrawerBuilder$6.onClick(DrawerBuilder.java:1768)
12-19 20:32:06.620 10651-10651/com.company.app W/System.err:     at com.mikepenz.materialdrawer.DrawerBuilder$6.onClick(DrawerBuilder.java:1742)
12-19 20:32:06.620 10651-10651/com.company.app W/System.err:     at com.mikepenz.fastadapter.FastAdapter$1.onClick(FastAdapter.java:580)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at com.mikepenz.fastadapter.utils.EventHookUtil$1.onClick(EventHookUtil.java:72)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.view.View.performClick(View.java:6256)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.view.View$PerformClick.run(View.java:24701)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.os.Handler.handleCallback(Handler.java:789)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:98)
12-19 20:32:06.621 10651-10651/com.company.app W/System.err:     at android.os.Looper.loop(Looper.java:164)
12-19 20:32:06.622 10651-10651/com.company.app W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6541)
12-19 20:32:06.622 10651-10651/com.company.app W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-19 20:32:06.622 10651-10651/com.company.app W/System.err:     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
12-19 20:32:06.622 10651-10651/com.company.app W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
12-19 20:32:06.628 10651-10651/com.company.app D/AndroidRuntime: Shutting down VM
12-19 20:32:06.630 10651-10651/com.company.app E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: com.company.app, PID: 10651
                                                                      java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
                                                                          at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:394)
                                                                          at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:441)
                                                                          at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:432)
                                                                          at com.company.app.activities.MainActivity.selectDrawerItem(MainActivity.java:265)
                                                                          at com.company.app.activities.MainActivity$3.onItemClick(MainActivity.java:225)
                                                                          at com.mikepenz.materialdrawer.DrawerBuilder$6.onClick(DrawerBuilder.java:1768)
                                                                          at com.mikepenz.materialdrawer.DrawerBuilder$6.onClick(DrawerBuilder.java:1742)
                                                                          at com.mikepenz.fastadapter.FastAdapter$1.onClick(FastAdapter.java:580)
                                                                          at com.mikepenz.fastadapter.utils.EventHookUtil$1.onClick(EventHookUtil.java:72)
                                                                          at android.view.View.performClick(View.java:6256)
                                                                          at android.view.View$PerformClick.run(View.java:24701)
                                                                          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.app.ActivityThread.main(ActivityThread.java:6541)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
rafsanahmad007
  • 23,683
  • 6
  • 47
  • 62
  • Please add the error message displayed in LogCat! :) – Jorgesys Dec 19 '17 at 20:22
  • I have added the logcat output –  Dec 19 '17 at 20:35
  • Possible duplicate of [Preference Fragment with android.support.v4.app.Fragment](https://stackoverflow.com/questions/35919798/preference-fragment-with-android-support-v4-app-fragment) – petey Dec 19 '17 at 21:09

1 Answers1

2

You SettingsFragment is extending the PreferenceFragment which can not be cast to Fragment

The workaround for this is to load your PreferenceFragment separately inside your Newly Created Fragment class:

Code

 public class SettingsFragment extends Fragment {

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        getActivity().getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new MyPreferenceFragment())
                .commit();
    }

    public static class MyPreferenceFragment extends PreferenceFragment {
        public MyPreferenceFragment() {
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.settings);
        }
    }
}

Also for your Fragment root layout: add

android:background="?android:windowBackground"
android:clickable = "true"

this will solve the overlapping problem in fragment navigation.

rafsanahmad007
  • 23,683
  • 6
  • 47
  • 62
  • the logcat says...`java.lang.ClassCastException: com.company.app.fragments.SettingsFragment cannot be cast to android.support.v4.app.Fragment`-----@petey – rafsanahmad007 Dec 19 '17 at 21:07
  • yup, totally missed that. however the same issue will be observed. An answer to this question may be found here :https://stackoverflow.com/questions/35919798/preference-fragment-with-android-support-v4-app-fragment – petey Dec 19 '17 at 21:10
  • that's exactly why i used `getFragmentManager()`...cause `getSupportFragmentManager()` won't work... – rafsanahmad007 Dec 19 '17 at 21:17
  • Thanks for the help - it is working fine now however there is one other small problem. When I navigate to other fragments, the (Settings fragment) is always loaded in the background –  Dec 19 '17 at 21:41
  • Replace `android.R.id.content`..with your `Framelayout`..id --`R.id.flContent` – rafsanahmad007 Dec 19 '17 at 21:46
  • add `android:background="?android:windowBackground"`...to your all fragment root layout files...here is the [Tips](https://stackpointer.io/android/fragment-replace-still-visible/399/) – rafsanahmad007 Dec 19 '17 at 21:51
  • you need to add `android:clickable = "true"`...for the root fragment layout also , so the click listener work perfectly. – rafsanahmad007 Dec 19 '17 at 22:00
  • (android:clickable = "true") - Do I need to add this to all fragments? –  Dec 19 '17 at 22:06