You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Fragment中实现音频播放器时遇Cannot resolve method 'create(com.example.jagi.Med1Fragment, int)'错误的解决求助

解决Fragment中音频播放器的实现问题

我帮你梳理下问题并给出修正方案,你遇到的错误和功能无法正常工作主要有两个核心原因:


问题1:控件初始化时机错误

在Fragment的onCreate()方法中,视图还没有被Inflate出来,此时调用findViewById()会直接返回null,不仅会导致空指针异常,还会影响后续的播放器逻辑。所有和视图相关的操作都应该放在视图创建完成后执行。

问题2:MediaPlayer的Context参数(次要,但需优化)

你已经用了getActivity()来传递Context,但更推荐用requireContext(),它会确保Context不为null,避免潜在的空指针风险。


修正后的完整代码

我把所有视图相关的逻辑移到了onViewCreated()方法中,同时添加了生命周期的资源释放逻辑,避免内存泄漏:

package com.example.jagi;
import android.annotation.SuppressLint;
import android.media.MediaPlayer;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import java.util.concurrent.TimeUnit;

public class Med1Fragment extends Fragment {
    TextView playerposition, playerduration;
    SeekBar seekBar;
    ImageView btnrew, btnplay, btnpause, btnff;
    MediaPlayer mediaPlayer;
    Handler handler = new Handler();
    Runnable runnable;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 只负责Inflate视图,不做任何控件初始化或逻辑操作
        return inflater.inflate(R.layout.fragment_med1, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
        // 从已创建的视图中获取控件实例
        playerposition = view.findViewById(R.id.player_position);
        playerduration = view.findViewById(R.id.player_duration);
        seekBar = view.findViewById(R.id.seek_bar);
        btnrew = view.findViewById(R.id.bt_rew);
        btnplay = view.findViewById(R.id.bt_play);
        btnpause = view.findViewById(R.id.bt_pause);
        btnff = view.findViewById(R.id.bt_ff);

        // 初始化MediaPlayer,使用requireContext()确保Context有效
        mediaPlayer = MediaPlayer.create(requireContext(), R.raw.meditation2);

        // 初始化进度更新的Runnable
        runnable = new Runnable() {
            @Override
            public void run() {
                if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                    seekBar.setProgress(mediaPlayer.getCurrentPosition());
                    handler.postDelayed(this, 500);
                }
            }
        };

        // 设置总时长
        int duration = mediaPlayer.getDuration();
        String sDuration = convertFormat(duration);
        playerduration.setText(sDuration);

        // 播放按钮点击事件
        btnplay.setOnClickListener(v -> {
            btnplay.setVisibility(View.GONE);
            btnpause.setVisibility(View.VISIBLE);
            mediaPlayer.start();
            seekBar.setMax(mediaPlayer.getDuration());
            handler.postDelayed(runnable, 0);
        });

        // 暂停按钮点击事件
        btnpause.setOnClickListener(v -> {
            btnpause.setVisibility(View.GONE);
            btnplay.setVisibility(View.VISIBLE);
            mediaPlayer.pause();
            handler.removeCallbacks(runnable);
        });

        // 快进按钮点击事件
        btnff.setOnClickListener(v -> {
            if (mediaPlayer == null) return;
            int currentposition = mediaPlayer.getCurrentPosition();
            int durationVal = mediaPlayer.getDuration();
            if(mediaPlayer.isPlaying() && durationVal != currentposition){
                currentposition = Math.min(currentposition + 5000, durationVal);
                playerposition.setText(convertFormat(currentposition));
                mediaPlayer.seekTo(currentposition);
            }
        });

        // 快退按钮点击事件
        btnrew.setOnClickListener(v -> {
            if (mediaPlayer == null) return;
            int currentposition = mediaPlayer.getCurrentPosition();
            if(mediaPlayer.isPlaying() && currentposition > 5000){
                currentposition = Math.max(currentposition - 5000, 0);
                playerposition.setText(convertFormat(currentposition));
                mediaPlayer.seekTo(currentposition);
            }
        });

        // 进度条拖动事件
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser && mediaPlayer != null){
                    mediaPlayer.seekTo(progress);
                    playerposition.setText(convertFormat(progress));
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {}

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {}
        });

        // 播放完成监听
        mediaPlayer.setOnCompletionListener(mp -> {
            btnpause.setVisibility(View.GONE);
            btnplay.setVisibility(View.VISIBLE);
            mediaPlayer.seekTo(0);
            handler.removeCallbacks(runnable);
            seekBar.setProgress(0);
        });
    }

    @SuppressLint("DefaultLocale")
    private String convertFormat(int duration){
        return String.format("%02d:%02d" ,
                TimeUnit.MILLISECONDS.toMinutes(duration) ,
                TimeUnit.MILLISECONDS.toSeconds(duration) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)));
    }

    // 生命周期方法:释放MediaPlayer资源,避免内存泄漏
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
        handler.removeCallbacks(runnable);
    }
}

额外优化点说明

  1. 添加了mediaPlayer的非空判断,避免Fragment销毁后可能出现的空指针
  2. 在onDestroyView()中释放MediaPlayer资源并移除Handler回调,防止内存泄漏
  3. 快进/快退时添加了边界判断,避免超出音频的总时长或小于0
  4. 使用Lambda表达式简化了点击事件的写法(你也可以保留原有的匿名内部类写法)

内容的提问来源于stack exchange,提问作者yeontan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:32:39