java - 使用 YouTubePlayerFragment 时出现空白黑框

标签 java android android-fragments

编辑 cjohn捕获了缺失的一 block 。我忘记在 YTPlayerFragment 上调用 init()

Android 开发新手。我试图将 YouTube 视频放入 YouTubePlayerFragment 中,该 fragment 嵌套在另一个 fragment 中。 Logcat 没有显示任何错误,但我的播放器 fragment 只显示一个黑框。将日志语句放在我的 OnInitializedListener 中,似乎它甚至没有被调用。

包含 YouTubePlayerFragment 的 ContentFragment 是 ViewPager 内的一个选项卡。我的代码如下。 MainActivity ContentFragment、ContentFragment 包含 YouTubePlayerFragment。

MainActivity.java:

public class MainActivity extends FragmentActivity{

    TabsPagerAdapter mAdapter;
    ViewPager mViewPager;
    Boolean mLoggedIn;

    String[] mTabs = {"Library", "Content", "Quotes"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        final ActionBar actionBar = getActionBar();

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.viewPager);
        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        mViewPager.setAdapter(mAdapter);

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        ActionBar.TabListener tabListener = new ActionBar.TabListener() {
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
                mViewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {

            }

            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {

            }
        };

        for (String tab : mTabs) {
            actionBar.addTab(actionBar.newTab().setText(tab).setTabListener(tabListener));
        }


    }

}

TabsPagerAdapter.java:

public class TabsPagerAdapter extends FragmentPagerAdapter{
    public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch(position) {
            case 0:
                return new LibraryFragment();
            case 1:
                return new ContentFragment();
            case 2:
                return new QuotesFragment();
        }

        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
}

ContentFragment.java:

public class ContentFragment extends Fragment {

    public ContentFragment() {
        // Required empty public constructor
    }

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

    @Override
    public void onResume() {
        super.onResume();

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        setRetainInstance(true);
        View v = inflater.inflate(R.layout.fragment_content, container, false);
        YTPlayerFragment video = YTPlayerFragment.newInstance("nCgQDjiotG0");
        getFragmentManager().beginTransaction().replace(R.id.youtubeFragment, video).commit();
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

}

YTPlayerFragment.java:

public class YTPlayerFragment extends YouTubePlayerSupportFragment {

    private YouTubePlayer activePlayer;
    private final static String DEV_KEY = "KEY";

    public static YTPlayerFragment newInstance(String url) {

        YTPlayerFragment player = new YTPlayerFragment();

        Bundle bundle = new Bundle();
        bundle.putString("url", url);

        player.setArguments(bundle);
        return player;
    }


    private void init() {
        initialize(DEV_KEY, new YouTubePlayer.OnInitializedListener() {
            @Override
            public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
                activePlayer = youTubePlayer;
                Log.d("YOUTUBE", "Successfully initialized");
                activePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
                if (!b) {
                    activePlayer.cueVideo(getArguments().getString("url"));
                }
            }

            @Override
            public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
                Log.e("YOUTUBE", youTubeInitializationResult.toString());
            }
        });
    }


}

fragment_content.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:padding="2dp"
              android:clipToPadding="false"
              android:scrollbarStyle="outsideOverlay"
              android:orientation="vertical" >
    <FrameLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:id="@+id/youtubeFragment" />

</LinearLayout>

最佳答案

在您的 ContentFragment 中,您尝试添加另一个 Fragment 作为子项。为此,您需要通过调用 getChildFragmentManager() 获取 fragment 管理器:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    setRetainInstance(true);
    View v = inflater.inflate(R.layout.fragment_content, container, false);
    YTPlayerFragment video = YTPlayerFragment.newInstance("nCgQDjiotG0");
    getChildFragmentManager().beginTransaction().replace(R.id.youtubeFragment, video).commit();
    return v;
}

关于java - 使用 YouTubePlayerFragment 时出现空白黑框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22334839/

相关文章:

java - iText - com.itextpdf.tool.xml.exceptions.NotImplementedException

Android 谷歌地图无法在 fragment 中工作

android - Fragment 的 onActivityCreated() 在 Activity 的 onDestroy() 之后被调用

android - 将对象从 Activity 传递到 fragment 引用或值吗?

java - 创建自定义颜色时,我得到 "syntax error on tokens, delete these tokens"

java - 无法使用 zipfile.ZIP_DEFLATED 压缩方法提取使用 Python 创建的 ZIP 文件

java - 如何处理 Android/Maven 项目中缺少 src/test/java 源文件夹?

javascript - React Native 版本不匹配 - Native 版本 : 0. 59.5

android - 是否可以在Android手机中获取NFC芯片的型号名称?

java - Ant 任务参数的顺序