Android findViewById为SurfaceView返回null

Android findViewById为SurfaceView返回null,android,surfaceview,Android,Surfaceview,在我的Android项目中,我使用SurfaceView播放视频。但是findViewById为SurfaceView返回null 这是我的代码: MultipleVideoPlayFragmentActivity.java public class MultipleVideoPlayFragmentActivity extends Activity { private static final String TAG = "MediaPlayer"; @Override

在我的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);
    }



}
VideoFragment.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>
<?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" />

multi_videos_fragment_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>
<?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" />

我在
VideoFragment.java类中的mSurfaceHolder=mSurfaceView.getHolder()


请为我提供解决方案。

我认为您没有在onActivityCreate()方法中调用onCreateView()。

我认为您没有在onActivityCreate()方法中调用onCreateView()。

尝试移动这部分代码:

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

转到您的
onCreateView()
方法。

尝试移动这部分代码:

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

到您的
onCreateView()
方法。

onCreateView()是片段的回调。你永远不需要直接打电话给它。在使用v查找id之前,您是否测试过v不为null?onCreateView()是片段的回调。你永远不需要直接打电话给它。在使用v查找id之前,您是否测试过v不为null?在AndroidManifest xml文件中,一切正常?在AndroidManifest xml文件中,一切正常?