IllegalStateException:片段 YoutubeLessonFragment 未附加到上下文

Swa*_*nil 1 android android-context android-youtube-api

YouTubePlayerSupportFragment在我的一个片段中使用,但我没有在布局文件中使用它,而是以编程方式初始化它。一些用户在运行时面临此崩溃:

Fatal Exception: java.lang.IllegalStateException: Fragment YoutubeLessonFragment{3a2e875} not attached to a context.
       at android.support.v4.app.Fragment.requireContext(Fragment.java:614)
       at android.support.v4.app.Fragment.getResources(Fragment.java:678)
       at android.support.v4.app.Fragment.getString(Fragment.java:700)
       at com.musicmuni.riyaz.youtubelesson.YoutubeLessonFragment.loadYoutubeVideo(YoutubeLessonFragment.java:168)
       at com.musicmuni.riyaz.youtubelesson.YoutubeLessonPresenter$2.onModuleLoaded(YoutubeLessonPresenter.java:188)
       at com.musicmuni.riyaz.data.AppDataRepositoryImpl$10.run(AppDataRepositoryImpl.java:187)
       at android.os.Handler.handleCallback(Handler.java:754)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:163)
       at android.app.ActivityThread.main(ActivityThread.java:6221)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
Run Code Online (Sandbox Code Playgroud)

我用于初始化 youtube 片段的代码如下:

private YouTubePlayerSupportFragment youtubePlayerFrag;
.........
    public void loadYoutubeVideo(String videoId) {
            mVideoId = videoId;
            if(getContext() != null) {
                youtubePlayerFrag = YouTubePlayerSupportFragment.newInstance();
                youtubePlayerFrag.initialize(getString(R.string.youtube_api_developer_key),
                        this);
                getChildFragmentManager().beginTransaction().add(R.id.flYoutubeVideoHolder,
                        youtubePlayerFrag).commit();
            }
        }
Run Code Online (Sandbox Code Playgroud)

其中,loadYoutubeVideo(...)从正在运行的线程加载所需要的视频ID的背景下得到一个回调。这里有什么指点吗?

Par*_* P. 8

可能您Fragmentactivity调用getString()方法时没有附加到。

因为文档说:

Fragment 现在具有 requireContext()、requireActivity()、requireHost() 和 requireFragmentManager() 方法,它们返回等效 get 方法的 NonNull 对象或抛出 IllegalStateException。

您可能想通过调用isAdded()片段的方法来检查片段是否附加到活动。

您也可以将参数直接传递给newInstance(..args..)而不是创建initialise()方法。