方法调用getActivity()。getSupportFragmentManager()可能会在片段中产生空指针异常

时间:2018-04-26 06:33:46

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

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

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

enter image description here

4 个答案:

答案 0 :(得分:0)

试试此代码

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

答案 1 :(得分:0)

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

getActivity()无法保证始终返回活动。例如,当片段被创建但尚未附加时,即getActivity()在构造函数中调用时将始终返回null。 getSupportFragmentManager()也是如此,它也需要连接fragement,以获得相应的片段主机。

所以,你必须确保你只在一个众所周知的上下文中调用这些函数,保证片段被附加(比如在onAttached()函数中),或者你必须包含调用空检查

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

答案 2 :(得分:0)

当前,此方法已被弃用,但是此代码行删除了该警告。 覆盖片段中的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()

答案 3 :(得分:0)

为了防止出现此警告,我通常使用以下模式:

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