2012-10-27 40 views
4

初始状态:预载所有片段的视图?

您好,我目前正在更新现有应用程式,并与一个特定活动的问题。它包含7个选项卡,在这些选项卡中有不同方法的几个图像按钮和文字浏览。

在应用程序的原始版本中,我使用了一个tabhost,并且基本上拥有一个xml文件和一个java文件所需的所有内容,但是无法将tabcontent横向滑动以更改制表符,因此我创建了整个事情再次与片段。

挑战:

在动作条,我有一个过滤器按钮,是应该隐藏所有标签中的某些textviews和imagebuttons,通过检查标志,然后调用所有的7种片段类的方法,然后在其rootView中将视图设置为GONE并且如果再次切换到VISIBLE。

问题:

这个动作条按钮做工精细,如果用户翻阅所有的标签,但是,如果在应用程序的冷启动点击,它会崩溃的应用程序与空指针异常。 我怀疑这是因为还没有加载所有片段。

问:

我应该预装的所有片段在活动的开始? 如果是这样,我将如何做,并在什么文件将完成? 有没有另一种可能更好的方法来确保我可以操作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.toggleintroonly()的样品:

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也被预加载。

+0

你能添加更多关于'NullPointerException'的信息吗? –

+0

添加了logcat的错误 –

+1

感谢您花时间来构建/格式化您的问题:) –

回答

2

一对夫妇建议:

  1. 如果您正在使用7个标签的工作,你可能会考虑使用ViewPager代替。这将有助于加快用户体验。:)

  2. 确保您的Fragment s不会假定Activity已被创建,直到onActivityCreated()被调用。这可能是你得到NullPointerException的原因。您可以将Fragment作为独立的UI组件。如果您的Fragment正在互相交互,您可能需要重新考虑您的设计,因为这可能会使事情变得复杂。

  3. 除非您的Fragment需要很长时间才能创建/显示,否则我不确定是否需要预加载Fragment。有7个选项卡,用户可能不会使用全部Fragment,因此加载它们可能会造成浪费。预先选择少数几个也是没有意义的,因为你永远无法知道用户会选择下一个选项卡。在我看来,最好的解决方案只是初始化一个新的Fragment,并在用户点击选项卡时用它填充选项卡的视图。

+0

1.我使用这种类型的标签进行快速导航,所以在顶部有几个标签可见,标签栏可以滚动所以人们可以轻松地从标签7跳到标签1,而无需侧滑内容:https://picasaweb.google.com/106842831832923664939/ScreenCaptures?authkey=Gv1sRgCK_8jJiFpd2BjgE#5804035513041487042 –

+0

2.和3.过滤器操作是通过操作栏中的按钮进行调用,并且必须操作所有7个片段,而不是从一个片段内我想更改另一个片段的内容。 和4.因为过滤器按钮在整个活动中都可见,并且它的图标从“过滤器”更改为“全部显示”,所以我认为有意义的是,所有的选项卡都一次过滤,因为一旦设置了过滤器,用户期望,当他们改变标签以在那里找到过滤的内容。此行为与应用程序的先前版本以及旧版操作系统的版本一致 –

+0

此活动仅在具有处理能力的设备上调用,只有ICS和果冻bean设备才能获得此活动,甚至在即时加载的仿真程序上,所以在预加载片段时应该没有问题,但我不知道该怎么做。 –