TabHost活动中的碎片

时间:2011-06-21 17:54:31

标签: android android-fragments

我在我的应用程序中使用tabhost,其中3个选项卡与3个不同的活动相关联。在每个活动中,我需要添加一个片段(该片段包含一个从网络播放视频的视频播放器)。下面是添加片段的活动代码。



    public class FilmsActivity extends Activity {

        @SuppressWarnings("unused")
        private static final String TAG = "FilmsActivity";

        private static FragmentManager mFragmentManager;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.i(TAG, "Films onCreate ");
            mFragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
            // get a video fragment. Title and URI as the constructor arguments
            VideoViewer vvFragment = VideoViewer.newInstance("Testing",Uri.parse("http://daily3gp.com/vids/747.3gp"));
            Log.i(TAG, "Films onCreate 1");
            VideoViewer vvFragment = VideoViewer.newInstance("Testing",Uri.parse("/sdcard/family_guy_test.3gp"));
            Log.i(TAG, "Films onCreate 2");
            fragmentTransaction.add(android.R.id.tabcontent, vvFragment, "videoFragment");
            Log.i(TAG, "Films onCreate 3");
            fragmentTransaction.commit();
        }
    }

片段实现如下所示。



        public class VideoViewer extends Fragment {
        // Debug vars
        @SuppressWarnings("unused")
        private static final String TAG = "VideoViewer";
        private static final Boolean DBG_TOAST = false;
        private static final Boolean DBG_LOG = false;

        // Video Title, URL of the Video will be unique for each video. Save it in a member variable.
        private static final String VIDEO_TITLE = "title";
        private static final String VIDEO_URI = "uri";
        // Different states of the video viewer
        private static final int STATE_PAUSED = 0;
        private static final int STATE_PLAYING = 1;
        private static final int STATE_STOPPED = 2;
        // The view which holds the video player
        private VideoView mVideoView;
        // The transparent layout above the video which will be shown when it is paused and made not 
        // visible when the video is playing 
        // The title of the video is in the textview
        private TextView mVideoTitle;
        // UI Control Elements from the view.
        private ImageButton mPlayPauseButton;
        private Button mShareButton;
        private Button mAddToFavourites;
        // This holds the current state of the Video Viewer
        private int mVideoState;

        public static VideoViewer newInstance(String VideoTitle, Uri VideoUri) {
            VideoViewer VV = new VideoViewer();
            Bundle args = new Bundle();
            // Put the title and the uri in the bundle
            args.putString(VIDEO_TITLE, VideoTitle);
            args.putString(VIDEO_URI, VideoUri.toString());
            // Later on convert the string to Uri using uri.parse(string)
            return VV;
        }

        /* Return the view that is used by the fragment */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // Check if you want to use container or don't want to use anything
            return inflater.inflate(R.layout.fragment_video_viewer, null);
        }

        /* Initialize the variables here, retrieve views and  */
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            // Assignment for the local variables
            mVideoView = (VideoView) getView().findViewById(R.id.fragment_video_viewer_video);
            mVideoTitle = (TextView) getView().findViewById(R.id.fragment_video_viewer_title);
            // Use the video title as the Text in the TextView
            mVideoTitle.setText(getArguments().getString(VIDEO_TITLE));
            // Get the URL from the argument bundle
            Uri videoUri = Uri.parse(getArguments().getString(VIDEO_URI));
            videoUri = Uri.parse("http://daily3gp.com/vids/747.3gp");
            // Toast if the URI is null
            if(DBG_TOAST) {
                if (videoUri.toString() == "") {
                    // Tell the user to provide a media file URL/path.
                    Toast.makeText(getActivity().getApplicationContext(), "Uri is null", Toast.LENGTH_LONG).show();
                    // Use a default video
                    // videoUri = Uri.parse("http://daily3gp.com/vids/747.3gp");
                }
            }
            // Initialize a media controller and anchor the videoview to it
            MediaController mediaController = new MediaController(getActivity().getApplicationContext());
            mediaController.setAnchorView(mVideoView);

            mVideoView.setMediaController(mediaController);
            mVideoView.requestFocus();
            mVideoView.setVideoURI(videoUri);
            mVideoView.start();
        }
    }


有人可以告诉我实施的错误吗?空的Films活动将生成一个屏幕,其中包含3个预期的选项卡。但是,当我尝试使用此实现时,该应用程序根本没有运行。

电影活动是从mainactivity调用的,它创建了一个tabhost。因此,电影活动的观点应该转到android.R.id.tabcontent。我添加片段时应该使用它吗?

1 个答案:

答案 0 :(得分:2)

我解决了问题。我不得不延长FragmentActivity而不是Activity