Android 是否预加载所有片段的视图?

Android 是否预加载所有片段的视图?,android,android-fragments,android-tabs,Android,Android Fragments,Android Tabs,初步情况: 您好,我目前正在为一个现有应用程序进行更新,有一个特定活动出现问题。它包含7个选项卡,在这些选项卡中有几个用于不同方法的图像按钮和文本视图 在最初版本的应用程序中,我使用了一个tabhost,基本上在一个xml文件和一个java文件中包含了所有必要的内容,但是不可能从侧面滑动tabcontent来更改选项卡,所以我用片段再次创建了整个应用程序 挑战: 在ActionBar中,我有一个Filter按钮,它应该通过检查一个标志,然后调用所有7个片段类中的方法来隐藏所有选项卡中的某些Tex

初步情况:

您好,我目前正在为一个现有应用程序进行更新,有一个特定活动出现问题。它包含7个选项卡,在这些选项卡中有几个用于不同方法的图像按钮和文本视图

在最初版本的应用程序中,我使用了一个tabhost,基本上在一个xml文件和一个java文件中包含了所有必要的内容,但是不可能从侧面滑动tabcontent来更改选项卡,所以我用片段再次创建了整个应用程序

挑战:

在ActionBar中,我有一个Filter按钮,它应该通过检查一个标志,然后调用所有7个片段类中的方法来隐藏所有选项卡中的某些TextView和ImageButton,然后将其rootView中的视图设置为GONE,如果再次切换,则设置为VISIBLE

问题:

如果用户首先滚动所有选项卡,此ActionBar按钮工作正常,但如果单击应用程序的冷启动,则会导致应用程序崩溃,出现空指针异常。 我怀疑这是因为还没有加载所有片段

问题:

我应该在活动开始时预加载所有片段吗? 如果是这样的话,我将如何做到这一点,在什么样的文件中才能做到? 有没有其他更好的方法来确保我可以操作ActionBar中的所有选项卡/片段,即使我不知道以前打开过哪些片段? 我是否应该将所有这些方法合并到一个全局方法中?它会放在什么文件里

目前,它只起作用,如果你先滚动所有的标签,那么我可以随时切换过滤器

代码:

这在活动类中调用:

    public void toggleintroonly() {
    MenuItem toggle = menu.findItem(R.id.mtoggle);

    if (visible == 1) {
        Fragments1.toggleintroonly();
        Fragments2.toggleintroonly();
        Fragments3.toggleintroonly();
        Fragments4.toggleintroonly();
        Fragments5.toggleintroonly();
        Fragments6.toggleintroonly();
        Fragments7.toggleintroonly();
        toggle.setTitle(getString(R.string.menu4toggled));
        toggle.setIcon(R.drawable.ic_action_showall);
        visible = 0;
    } else {
        Fragments1.showall();
        Fragments2.showall();
        Fragments3.showall();
        Fragments4.showall();
        Fragments5.showall();
        Fragments6.showall();
        Fragments7.showall();
        toggle.setTitle(getString(R.string.menu4));
        toggle.setIcon(R.drawable.ic_action_filter);
        visible = 1;
    }
}
这是来自Fragments1的示例。仅适用于:

public static void toggleintroonly() {
    rootView.findViewById(R.id.tv1x02).setVisibility(View.GONE);
    rootView.findViewById(R.id.bplay1x02).setVisibility(View.GONE);
    rootView.findViewById(R.id.bshare1x02).setVisibility(View.GONE);
    rootView.findViewById(R.id.binfo1x02).setVisibility(View.GONE);
    rootView.findViewById(R.id.bring1x02).setVisibility(View.GONE);
}
以下是在活动启动后单击ActionBar中的筛选器按钮时出现的错误:

10-27 16:43:34.923: E/MediaPlayer(16946): mOnCompletionListener is null. Failed to send MEDIA_PLAYBACK_COMPLETE message.
10-27 16:43:49.433: D/AndroidRuntime(16946): Shutting down VM
10-27 16:43:49.433: W/dalvikvm(16946): threadid=1: thread exiting with uncaught exception (group=0x40c511f8)
10-27 16:43:49.448: E/AndroidRuntime(16946): FATAL EXCEPTION: main
10-27 16:43:49.448: E/AndroidRuntime(16946): java.lang.NullPointerException
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.cheftony.psychsoundboard.Fragments3.toggleintroonly(Fragments3.java:225)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.cheftony.psychsoundboard.NicknamesNew.toggleintroonly(NicknamesNew.java:121)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.cheftony.psychsoundboard.NicknamesNew.onOptionsItemSelected(NicknamesNew.java:90)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at android.app.Activity.onMenuItemSelected(Activity.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:353)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at android.view.View.performClick(View.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at android.view.View$PerformClick.run(View.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at android.os.Handler.handleCallback(Handler.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at android.os.Handler.dispatchMessage(Handler.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at android.os.Looper.loop(Looper.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at android.app.ActivityThread.main(ActivityThread.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at java.lang.reflect.Method.invokeNative(Native Method)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at java.lang.reflect.Method.invoke(Method.java:511)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
10-27 16:43:49.448: E/AndroidRuntime(16946):    at dalvik.system.NativeStart.main(Native Method)
该错误似乎是由Fragments3类引起的,因为在活动开始时,Fragments1处于活动状态,其直接相邻的Fragments2也已预加载。

有几点建议:

如果您使用7个选项卡,则可以考虑使用VIEWPAGE。这将有助于加快用户体验

确保在调用onActivityCreated之前,片段不会假定活动已创建。这可能是您得到NullPointerException的原因

您的片段应该作为独立的UI组件。如果您的片段彼此交互,您可能需要重新思考您的设计,因为这可能会使事情复杂化

除非创建/显示您的片段花费了很长时间,否则我不确定是否需要预加载片段。对于7个选项卡,用户可能不会使用所有片段,因此加载所有片段可能是浪费。预装一些精选的标签也没有意义,因为你永远不知道用户下一步会选择哪个标签。在我看来,最好的解决方案是初始化一个新片段,并在用户单击选项卡时用它填充选项卡的视图


您可以添加有关NullPointerException的更多信息吗?感谢您花时间组织/格式化您的问题:1。我使用这种选项卡进行快速导航,因此顶部有几个选项卡可见,选项卡栏可以水平滚动,因此可以轻松地从选项卡7跳到选项卡1,而无需侧扫内容:2。三,。filter操作是从actionbar中的一个按钮调用的,必须操作所有7个片段,我不想从一个片段中更改另一个片段的内容。四,。因为过滤器按钮在整个活动中都是可见的,并且在我看来,它的图标从filter变为show all,所以所有选项卡都会同时被过滤是有意义的,因为一旦设置了过滤器,用户希望在更改选项卡时也能找到过滤后的内容。此行为与以前版本的应用程序和旧版OSS的版本一致此活动仅在能够处理此活动的设备上调用,只有ICS和jelly bean设备才能获得此活动,甚至在它立即加载的模拟器上,因此预加载片段应该没有问题,我不知道怎么做。