TheOnlyAnil
TheOnlyAnil

Reputation: 897

What to use in ViewPager Navigation - A fragment-to-fragment or fragment-to-activity?

What is better to implement in ViewPager?

  1. A fragment that opens another fragment by replacing fragment.

OR

  1. A Fragment which opens an activity by intent.

I have used both and both have their own drawbacks.

Problems with 1st.

  1. It shows viewPager tabs and not that parent "back arrow" when in
    2nd fragment.
  2. It causes ANR errors with strange logcat errors when going to back stack. (Not everytime, and this is causing me pain in my head). (see logcat below)

Problems with 2nd.

  1. It goes from fragment to activity, but after returning from 2nd to first, upon pressing on back button, it again goes back to activity and after one more press of back button it goes to very first state of fragment/viewpager/mainActivity.

Logcat

E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.widefide.musicplayer, PID: 14058
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.widefide.musicplayer/com.widefide.musicplayer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947)
            at android.app.ActivityThread.access$900(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
            at com.widefide.musicplayer.Fragments.Playlists.PlaylistsFragment.onActivityCreated(PlaylistsFragment.java:72)
            at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1797)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:979)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1120)
            at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1929)
            at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547)
            at com.widefide.musicplayer.MainActivity.onStart(MainActivity.java:127)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236)
            at android.app.Activity.performStart(Activity.java:6006)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947)
            at android.app.ActivityThread.access$900(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Upvotes: 0

Views: 125

Answers (3)

Jemshit
Jemshit

Reputation: 10038

In 1st, you can replace fragment itself by notifying parent Activity and Activity will replace that fragment with some other fragment. You still have control of Toolbar from your Activity. You can do this by either default fashion (with interface) or by using Bus events (Otto)

In 2nd, which i would prefer this, you easily open activity with intent and you can control your back press by either onBackPressed or fragment backstack.

Upvotes: 2

Naveen Kumar M
Naveen Kumar M

Reputation: 7557

ViewPager is a Fragment to Fragment Navigation.

You have to pass list of fragment. When you scroll the page the fragment will be replaced with next fragment.

Refer this link

Upvotes: 0

ciprian
ciprian

Reputation: 151

From 1st problem in first case it is clear that you want a new screen so best will be a new activity. Problem in second solution seems like a bug, post the code so we can solve it.

Upvotes: 0

Related Questions