2

在下面的代码中,我想从 google 的 youtube API for Android 启动一个 YouTubePlayerFragment 对象。但是它只会在我第一次运行应用程序时启动。我无法控制 Google API 的称为 YouTubePlayerFragment 的片段的生命周期,它扩展了片段,并且基本上是一个内部带有 youtube 播放器的片段。

我无法控制这个 youtube 播放器。获取 youtubeplayer 对象并控制播放器生命周期的唯一方法是调用 onInitializationSuccess() 方法,您不能这样做,因为该方法由操作系统调用。这是一个回调方法。

我无法弄清楚为什么我会遇到空指针异常和其他错误的所有这些问题。基本上,我从可见性中删除了视频,然后仅在用户单击 WebView 中的链接后才显示可见的片段,其中 URL 中包含子字符串“youtube”。然后它会将 youtube 片段设置为可见。我想获取 URL 并开始播放该链接上的视频。

如果我尝试片段事务 remove() 和 add() 方法,我会得到空指针并崩溃。

如果我不删除片段。然后下次用户点击 webview 中的 youtube 链接时,它会开始播放与之前的链接中相同的 youtube 视频,而不是刚刚点击的链接。它在之前停止的相同位置开始播放。

我要做的就是杀死这个 youtube API 片段并重新启动一个新片段。

我该如何解决这个问题?

  public class MainActivity extends YouTubeFailureRecoveryActivity {

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

   handler = new Handler();
   storedVideoUrl = ""; 
   playTube = false;

   setContentView(R.layout.fragments_demo);
   pageView = (WebView) findViewById(R.id.webView1);
   coverImage = (ImageView) findViewById(R.id.imageView1);

   findViewById(R.id.youtube_fragment).setVisibility(View.INVISIBLE);

   youTubePlayerFragment = (YouTubePlayerFragment)
   getFragmentManager().findFragmentById(R.id.youtube_fragment);

youTubePlayerFragment.initialize(DeveloperKey.DEVELOPER_KEY, MainActivity.this);

coverImage.setVisibility(View.INVISIBLE);

pageView.loadUrl("http://www.example.com/");  

WebSettings webSettings = pageView.getSettings();

//ebSettings.setJavaScriptEnabled(true);


WebViewClient mWebClient = new WebViewClient()
{
    // Override page so it's load on my view only
    @Override
    public boolean shouldOverrideUrlLoading(WebView  view, String  url)
    {
        storedVideoUrl = url;
        playTube = true;

     if ( url.contains("youtube") == true ){
        // Load new URL Don't override URL Link

         videoRoot = youTubePlayerFragment.getView();
         videoUrl = url.substring(29, 40);
         coverImage.setVisibility(View.VISIBLE);
         videoRoot = youTubePlayerFragment.getView();

         if(videoRoot==null){
         videoRoot.setVisibility(View.INVISIBLE);
         }else{
             videoRoot.setVisibility(View.VISIBLE);
         }

            return true;

    } else{

     coverImage.setVisibility(View.INVISIBLE);


     // Return true to override url loading (In this case do nothing).
     return false;
     // if return is true, do nothing. don't load url

    }
 }


  };

   pageView.setWebViewClient(mWebClient);

 }  // end onCreate 


  public YouTubePlayer.Provider getPlayer() {
return player;
 }


 @Override
  public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
  boolean wasRestored) {
if (!wasRestored) {

 player.loadVideo("videoUrl");
    }
   }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{

    if (pageView.canGoBack()){

        if((videoRoot.getVisibility())==View.VISIBLE){
             coverImage.setVisibility(View.INVISIBLE);
             videoRoot.setVisibility(View.INVISIBLE);

             return true;
        }else {

        pageView.goBack();

        return true;
        }
    }
}

return super.onKeyDown(keyCode, event);
 }

  @Override
  protected Provider getYouTubePlayerProvider() {
// TODO Auto-generated method stub
return null;
  }

  }  // end fragment demo activity
4

2 回答 2

0

我对 Android Youtube API 不是很熟悉,但我建议你在添加YoutubeFragment. 在您的 Fragment 中使用它:

public static ColorPickerDialog newInstance(int num) {
            ColorPickerDialog f = new ColorPickerDialog();

            // Supply num input as an argument.
            Bundle args = new Bundle();
            args.putInt("num", num);
            f.setArguments(args);

            return f;
    }

并添加您Fragment使用类似于此的内容:

    @SuppressLint("CommitTransaction")
    public void showDialog() {
            mDialogInstance++;
            // DialogFragment.show() will take care of adding the fragment
            // in a transaction. We also want to remove any currently showing
            // dialog, so make our own transaction and take care of that here.
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
            if (prev != null) {
                    ft.remove(prev);
            }
            ft.addToBackStack(null);

            // Create and show the dialog.
            DialogFragment mColorPicker = ColorPickerDialog
                            .newInstance(mDialogInstance);
            mColorPicker.show(ft, "dialog");
    }

如果这能解决您的问题,请检查此项。

于 2013-04-03T06:37:13.323 回答
0

您不能删除fragment已在您膨胀的 XML 布局中声明的 a。如果您想随意添加和删除片段,您必须创建它们并以编程方式添加它们。

这可能就是您在尝试删除YouTubePlayerFragment.

如果我尝试片段事务 remove() 和 add() 方法,我会得到空指针并崩溃。

于 2013-04-03T13:59:23.957 回答