【问题标题】:What to use in ViewPager Navigation - A fragment-to-fragment or fragment-to-activity?在 ViewPager 导航中使用什么 - 片段到片段或片段到活动?
【发布时间】:2015-09-08 18:38:48
【问题描述】:

在 ViewPager 中实现什么更好?

  1. 通过替换片段打开另一个片段的片段。

  1. 按意图打开活动的片段。

我都用过,两者都有自己的缺点。

第一个问题。

  1. 它显示 viewPager 选项卡,而不是在
    第二个片段。
  2. 返回时会导致 ANR 错误和奇怪的 logcat 错误 堆。 (不是每次,这让我头疼)。 (见下面的 logcat)

第二个问题。

  1. 它从片段转到活动,但在从第二个返回到 首先,按下后退按钮后,它再次回到活动状态 再按一次后退按钮后,它会进入第一个状态 片段/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)

【问题讨论】:

  • 你决定。这两个问题看起来都可以解决(除了 viewpager 仍然显示选项卡),您应该只显示一些代码。
  • 我的意思是哪个更好用?如果你必须实现一个,你会选择哪一个?
  • 没有更好的选择,看内容。显示联系人列表并通过单击联系人转到他的个人资料页面?最好参加一项新活动。显示用户可以通过单击编辑的简单字符串列表?最好呆在那里。这取决于设计选择、标签的排列方式……

标签: android android-fragments android-activity android-viewpager


【解决方案1】:

1st中,您可以通过通知父级Activity 来替换fragment 本身,而Activity 将用其他一些fragment 替换fragment。您仍然可以通过 Activity 控制 Toolbar。您可以通过default fashion(使用interface)或使用Bus events (Otto)来做到这一点

2nd 中,我更喜欢这样,您可以轻松地打开 activity,并可以通过 onBackPressedfragment backstack 控制您的后按。

【讨论】:

    【解决方案2】:

    从第一种情况的第一个问题很明显,您想要一个新屏幕,所以最好是一个新活动。第二个解决方案中的问题似乎是一个错误,请发布代码以便我们解决它。

    【讨论】:

      【解决方案3】:

      ViewPager 是一个片段到片段的导航。

      您必须传递片段列表。当您滚动页面时,该片段将被替换为下一个片段。

      Refer this link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多