Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在MediaController上调用.show()时引发空指针异常_Java_Android_Mediacontroller - Fatal编程技术网

Java 在MediaController上调用.show()时引发空指针异常

Java 在MediaController上调用.show()时引发空指针异常,java,android,mediacontroller,Java,Android,Mediacontroller,我发现这个问题被标记为关于如何防止空指针异常的重复问题。澄清一下,问题是图书馆把它扔了。我的变量不是空的。关于库的更具体的帮助更有用 我正在创建一个用于播放音乐的应用程序。我试图利用MediaController类为正在播放的歌曲添加控件。但是,当我运行.show()函数时,我得到一个空指针异常 以下是MediaController的代码: public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInst

我发现这个问题被标记为关于如何防止空指针异常的重复问题。澄清一下,问题是图书馆把它扔了。我的变量不是空的。关于库的更具体的帮助更有用

我正在创建一个用于播放音乐的应用程序。我试图利用MediaController类为正在播放的歌曲添加控件。但是,当我运行
.show()
函数时,我得到一个空指针异常

以下是MediaController的代码:

public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {

    MediaController timer = view.findViewById(R.id.song_progress);
    timer.setMediaPlayer(new MediaController.MediaPlayerControl() {
        @Override
        public void start() {
            MainActivity.playingSong.start();
        }

        @Override
        public void pause() {
            MainActivity.playingSong.pause();
        }

        @Override
        public int getDuration() {
            return MainActivity.playingSong.getDuration();
        }

        @Override
        public int getCurrentPosition() {
            return MainActivity.playingSong.getCurrentPosition();
        }

        @Override
        public void seekTo(int pos) {
            MainActivity.playingSong.seekTo(pos);
        }

        @Override
        public boolean isPlaying() {
            return MainActivity.playingSong.isPlaying();
        }

        @Override
        public int getBufferPercentage() {
            return 0;
        }

        @Override
        public boolean canPause() {
            return true;
        }

        @Override
        public boolean canSeekBackward() {
            return true;
        }

        @Override
        public boolean canSeekForward() {
            return true;
        }

        @Override
        public int getAudioSessionId() {
            return MainActivity.playingSong.getAudioSessionId();
        }
    });
    timer.setAnchorView(view);
    timer.setEnabled(true);
    timer.show();

}
以下是错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.luner.mobilemusic, PID: 2021
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.measure(int, int)' on a null object reference
        at android.widget.MediaController.updateFloatingWindowLayout(MediaController.java:173)
        at android.widget.MediaController.show(MediaController.java:363)
        at android.widget.MediaController.show(MediaController.java:314)
        at com.luner.mobilemusic.Playlist$Song$PlayFragment.onViewCreated(Playlist.java:271)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7156)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
为什么会这样?有没有好的方法来解决这个问题,或者我应该完全使用另一个类?如果您有任何代码示例,我将不胜感激

另外,我发现删除
setAnchorView(view)
可以防止错误,但随后没有MediaController出现

编辑

经过更彻底的搜索,我发现了两件事:

  • 由于某些原因,行号不准确;
    updateFloatingWindowLayout
    的行出现在另一个方法中

  • 罪魁祸首是
    mDecor
    变量,它在运行
    setAnchorView
    方法时被设置为view变量。但是,视图变量不能为
    null
    ,因为这会在进入
    show
    函数之前导致异常。因此,我仍然不能很好地找出这个的来源。。。mDecor变量必须在某个地方设置为
    null
    ,但仅当我添加自定义锚定视图时

  • 编辑2


    在这一点上,我对程序做了很多更改,因此我无法测试解决方案是否有效。但是,请随时发布答案,以帮助其他人解决此问题。我会接受任何有大量赞成票的答案,因为赞成票意味着解决方案有效。感谢所有试图帮助的人

    很抱歉最后的评论。也许视图已经“显示”,但它不在前面?@MaartenBodewes你是说移除setAnchorView(视图)是解决方案吗?我不知道如何检查元素是否显示。@chrylis-on-strike-(我不知道chrylis是否会得到这个,所以如何做的提示很有用)我看到您将此作为副本关闭。但是,是的,这是关于空指针异常的,如果您进一步阅读这个问题,您会发现错误来自库中。MediaController变量不为null。我正试图找出我做错了什么,让图书馆抱怨。如果不查看描述,则标记为重复是不正确的。:)不,看起来您正在以某种方式将一个空的
    视图
    对象传递给
    onViewCreated
    。@chrylis onstrike-我明白您的意思。仔细观察之后,这似乎是正在发生的事情。然而,事实并非如此。它必须是库中的视图变量,因为在将视图变量发送到MediaController库之前,我运行了视图变量的方法。他们会先发出自己的空指针异常。