gpt4 book ai didi

android - 预加载所有 fragment 的 View ?

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:38 24 4
gpt4 key购买 nike

初始情况:

您好,我目前正在对现有应用程序进行更新,但在某项特定 Activity 中遇到了问题。它包含 7 个选项卡,在这些选项卡中有几个用于不同方法的图像按钮和 TextView 。

在应用程序的原始版本中,我使用了一个 tabhost,并且基本上在一个 xml 文件和一个 java 文件中包含了所有必要的内容,但是不可能横向滑动 tabcontent 来更改选项卡,所以我创建了整个东西又是 fragment 。

挑战:

在 ActionBar 中,我有一个过滤器按钮,它应该从所有选项卡中隐藏某些 TextView 和图像按钮,方法是检查一个标志,然后调用所有 7 个 fragment 类中的方法,然后将它们的 rootView 中的 View 设置为 GONE如果再次切换,则为 VISIBLE。

问题:

如果用户首先滚动浏览所有选项卡,此 ActionBar 按钮工作正常,但如果在应用冷启动时单击,它将使应用崩溃并出现 NullPointer 异常。我怀疑这是因为尚未加载所有 fragment 。

问题:

我应该在 Activity 开始时预加载所有 fragment 吗?如果是这样,我将如何做到这一点以及将在哪个文件中完成?是否有另一种可能更好的方法来确保我可以操作 ActionBar 中的所有选项卡/fragment ,即使我不知道之前打开了哪些 fragment ?我应该将所有这些方法混合在一个全局方法中吗?它会放在什么文件中?

目前,如果您首先滚动浏览所有选项卡,它只有效,然后我可以根据需要随时切换过滤器。

代码:

这在 Activity 类中调用:

    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);
}

这是在 Activity 启动后单击 ActionBar 中的 Filter Button 时的错误:

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 类中引起的,因为在 Activity 启动时,Fragments1 处于 Activity 状态并且它的直接邻居 Fragments2 也被预加载。

最佳答案

一些建议:

  1. 如果您使用 7 个选项卡,您可以考虑改用 ViewPager。这将有助于加快用户体验。 :)

  2. 确保您的 Fragment 在调用 onActivityCreated() 之前不会假设 Activity 已经创建。这可能就是您收到 NullPointerException 的原因。

  3. 您的 Fragment 应该作为独立的 UI 组件。如果您的 Fragment 相互交互,您可能需要重新考虑您的设计,因为这可能会使事情复杂化。

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

关于android - 预加载所有 fragment 的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com