android - findViewById 为 SurfaceView 返回 null

标签 android surfaceview

在我的 Android 项目中,我使用 SurfaceView 来播放视频。但是 findViewById 为 SurfaceView 返回 null。

这是我的代码:

MultipleVideoPlayFragmentActivity.java

public class MultipleVideoPlayFragmentActivity extends Activity {

    private static final String TAG = "MediaPlayer";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.multi_videos_activity_layout);
    }



}

视频 fragment .java

public class VideoFragment extends Fragment implements
        OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener,
         OnVideoSizeChangedListener, SurfaceHolder.Callback {

    private static final String TAG = "MediaPlayer";

    private MediaPlayer mMediaPlayer;
    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;
    private boolean mSizeKnown;
    private boolean mVideoReady;
    View v;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.multi_videos_fragment_layout,
            container, false);

         return v;
     }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mSurfaceView = (SurfaceView) v.findViewById(
                R.id.video_surfaceview);

        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void onBufferingUpdate(MediaPlayer player, int percent) {
        Log.d(TAG, "onBufferingUpdate percent: " + percent);
    }

    public void onCompletion(MediaPlayer player) {
        Log.d(TAG, "onCompletion called");
    }

     public void onVideoSizeChanged(MediaPlayer player, int width, int height) {
        Log.v(TAG, "onVideoSizeChanged called");
        if (width == 0 || height == 0) {
            Log.e(TAG, "invalid video width(" + width + ") or height(" + height
                + ")");
            return;
        }

        mSizeKnown = true;
        if (mVideoReady && mSizeKnown) {
            startVideoPlayback();
        }
    }

    public void onPrepared(MediaPlayer player) {
        Log.d(TAG, "onPrepared called");

        mVideoReady = true;
        if (mVideoReady && mSizeKnown) {
            startVideoPlayback();
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int i, int j, int k) {
        Log.d(TAG, "surfaceChanged called");
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.d(TAG, "surfaceDestroyed called");
    }

    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG, "surfaceCreated called");

        try {
            mMediaPlayer = new MediaPlayer();
            AssetFileDescriptor afd = getActivity().getAssets().openFd(
                    "sample.3gp");
            mMediaPlayer.setDataSource(afd.getFileDescriptor(),
                    afd.getStartOffset(), afd.getLength());
            mMediaPlayer.setDisplay(mSurfaceHolder);
            mMediaPlayer.prepare();
            mMediaPlayer.setOnBufferingUpdateListener(this);
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setOnVideoSizeChangedListener(this);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
         } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        releaseMediaPlayer();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        releaseMediaPlayer();
    }

    private void releaseMediaPlayer() {
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

    private void startVideoPlayback() {
        Log.v(TAG, "startVideoPlayback");
        mMediaPlayer.start();
     }
}

multi_videos_activity_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment class="com.example.multivideo.VideoFragment"
         android:id="@+id/video_1_fragment" android:layout_width="0dp"
        android:layout_height="wrap_content" android:layout_weight="1" />


</LinearLayout>

multi_videos_fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/video_surfaceview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

我在
得到nullPointerException VideoFragment.java 类中的 mSurfaceHolder = mSurfaceView.getHolder()。

请提供解决方案。

最佳答案

尝试移动这部分代码:

 mSurfaceView = (SurfaceView) v.findViewById(R.id.video_surfaceview);

到您的 onCreateView() 方法。

关于android - findViewById 为 SurfaceView 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13698222/

相关文章:

java - 在 GLSurfaceView 上设置 AlphaAnimation

android - RXJava2 |安卓 : Filter arrayList and keep track of filter

Android - MyCustomView 扩展 SurfaceView 实现 Runnable、OnTouchListener

android - 如何将 Hashmap 数据设置为 android 中的 ListView ?

android - 添加自定义 View 作为 XML 布局的 View

android - 使用 SurfaceView 和 4 个 Canvas 图像如何找到哪个图像被触摸了?

android - 在 glThread 上运行长任务而不阻塞 Android 上的 UI 线程

java - 如何连续进行多次根操作(批量根操作)?

android - 从 android 中的 recyclerviewAdapter 中删除一个项目

android - 改变 MediaPlayer 的 SurfaceViews