Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何停止或重新启动YouTubePlayerFragment、android、Google Youtube API for android的新实例_Android_Android Fragments_Youtube Api - Fatal编程技术网

如何停止或重新启动YouTubePlayerFragment、android、Google Youtube API for android的新实例

如何停止或重新启动YouTubePlayerFragment、android、Google Youtube API for android的新实例,android,android-fragments,youtube-api,Android,Android Fragments,Youtube Api,在下面的代码中,我想从谷歌针对Android的youtube API启动一个YouTubePlayerFragment对象。但是,它只会在我第一次运行应用程序时启动。我无法控制Google API中名为YouTubePlayerFragment的片段的生命周期,它扩展了片段,基本上是一个包含youtube播放器的片段 我没有能力控制这个youtube播放器。获取youtubeplayer对象并控制播放器生命周期的唯一方法是调用onInitializationSuccess()方法,但您不能这样做

在下面的代码中,我想从谷歌针对Android的youtube API启动一个YouTubePlayerFragment对象。但是,它只会在我第一次运行应用程序时启动。我无法控制Google API中名为YouTubePlayerFragment的片段的生命周期,它扩展了片段,基本上是一个包含youtube播放器的片段

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

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

如果我尝试Fragment transaction 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

我对Android Youtube API不是很熟悉,但我建议您在添加
YoutubeFragment
时使用类似的方法。在片段中使用此选项:

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;
    }
并使用类似以下内容添加您的
片段

    @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");
    }

如果这样可以解决问题,请选中此项。

您无法删除已在XML布局中声明的
片段。如果您希望随意添加和删除片段,您必须创建它们并以编程方式添加它们

这可能就是为什么在尝试删除
youtubeplayerfracent
时会出现这种情况

如果我尝试使用片段事务remove()和add()方法,则会得到null 指针和崩溃


请看一下参考文档():每当调用其onDestroyView()方法时,就会释放与此片段关联的YouTubeplyer。因此,无论何时重新创建与此片段关联的活动,您都必须重新调用initialize(String,YouTubePlayer.OnInitializedListener),即使通过设置setRetainInstance(布尔值)在活动重新创建过程中保留片段实例也是如此。