【问题标题】:method invocation getActivity().getSupportFragmentManager() may produce null pointer exception in fragment方法调用 getActivity().getSupportFragmentManager() 可能会在片段中产生空指针异常
【发布时间】:2018-04-26 06:33:45
【问题描述】:

“下面是我的代码和图片链接”

MyFragment newFragment = new MyFragment();


    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();

    ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
    ft.replace(R.id.guide_frame_container, newFragment)
            .addToBackStack(null)
            .commit();

【问题讨论】:

  • 发布您在 Logcat 中遇到的错误
  • newFragment 在哪里初始化???为什么要在 backStack 中添加 null ??
  • 好的,你的问题是什么?
  • MyFragment newFragment = new MyFragment();这是我对 newfragment 的初始化。
  • 它显然看起来像 android studio 中显示的警告。这不是错误只是警告。如果出现错误,请先运行您的应用程序,然后在此处发布您的 logcat

标签: java android android-fragments fragment android-fragmentactivity


【解决方案1】:

试试这个代码

MyFragment newFragment = new MyFragment();
getSupportFragmentManager().beginTransaction()
    .setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right)
    .replace(R.id.guide_frame_container, newFragment)
    .addToBackStack("MyFragment")
    .commit();

【讨论】:

    【解决方案2】:

    这是一个 Android Studio 警告,没有错误。但是你应该关心它!

    getActivity() 不能保证总是返回一个活动。例如,当片段已创建但尚未附加时,即getActivity() 在构造函数中调用时将始终返回 null。 getSupportFragmentManager() 也一样,它也需要附加片段,以获取其对应的片段主机。

    因此,您必须确保仅在众所周知的上下文中调用这些函数,在该上下文中保证附加片段(如在onAttached() 函数中),或者您必须将调用包装在空检查中

    此外,绝对不清楚您在哪里调用这些函数。我假设,您尝试调用 static Fragment newInstance() 函数内部的那些,该函数将为您创建片段。但是,您永远不应该尝试将片段附加到那里。它应该由宿主活动完成。

    【讨论】:

      【解决方案3】:

      目前,此方法已被弃用,但这一行代码仍然删除了该警告。 在您的片段中覆盖 onAttach 。然后在上面取一个像这样的 Activity 类的实例。

      private Activity mActivity;
      
      @Override
      public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // your code
      }
      
      @Override
      public void onAttach(@NonNull Activity activity) {
          super.onAttach(activity);
          mActivity = activity;
      }
      

      现在用 mActivity 代替 getActivity()

      【讨论】:

        【解决方案4】:

        为了防止这个警告,我通常使用这种模式:

        Objects.requireNonNull(getActivity(), "<some message describing what went wrong>")
        

        这将引发一个异常,让您更好地了解刚刚发生的事情。

        这是一个更长的例子:

        Objects.requireNonNull(getActivity(), "Activity not available in traffic control fragment")
                    .getSupportFragmentManager().addOnBackStackChangedListener(() -> {
                        setRepeatButtonText(getView());
                        setSwitchButtonState(switchButton);
                        if (mainActivity.getTabIndex() == 2 && getFragmentManager()!=null && getFragmentManager().getBackStackEntryCount() == 0){
                            mainActivity.setDateOnABar(getString(org.brahmakumaris.beezone.R.string.traffic_control));
                        }
                        else if (mainActivity.getTabIndex() == 2 && getFragmentManager()!=null && getFragmentManager().getBackStackEntryCount() == 1){
                            mainActivity.setDailyOnABar(getString(org.brahmakumaris.beezone.R.string.traffic_control), false);
                        }
                    });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-12
          • 2016-06-24
          • 1970-01-01
          • 2013-01-16
          • 2013-05-14
          • 2016-09-20
          相关资源
          最近更新 更多