如何在android片段中实例化YoutubePlayerView

如何在android片段中实例化YoutubePlayerView,android,kotlin,android-youtube-api,Android,Kotlin,Android Youtube Api,我正在创建一个从youtube加载视频的应用程序。我遇到的问题是,我不知道如何在android片段中实例化YoutubePlayerView,因为我的应用程序只有一个活动,所有UI内容都是通过片段和导航图管理的 我唯一能弄明白的是在YoutubeBaseActivity中实例化YoutubePlayerView,这将损害导航的一致性,因为这将是一个新的活动。 我尝试创建YoutubePlayerFragment,但无法将其设置为导航图中的目标。 因此,如果有人能帮我找到解决办法,我将不胜感激 提

我正在创建一个从youtube加载视频的应用程序。我遇到的问题是,我不知道如何在android片段中实例化YoutubePlayerView,因为我的应用程序只有一个活动,所有UI内容都是通过片段和导航图管理的

我唯一能弄明白的是在YoutubeBaseActivity中实例化YoutubePlayerView,这将损害导航的一致性,因为这将是一个新的活动。 我尝试创建YoutubePlayerFragment,但无法将其设置为导航图中的目标。 因此,如果有人能帮我找到解决办法,我将不胜感激


提前感谢。

对于今天有此问题的任何人,这就是我所做的,它非常适合活动和片段

1。放置框架布局

在活动或片段XML中,放置一个
FrameLayout
。很简单

   <FrameLayout
    android:id="@+id/main_player"
    android:layout_width="match_parent"
    android:layout_height="0dp"/>
因此,如果这些代码行给您带来错误,您必须在这个新路径中创建一个新类
com.google.android.youtube.player
,并在此目录中创建一个新类。你可以随便叫它什么。只需复制并粘贴以下内容:

package com.google.android.youtube.player //<--- IMPORTANT!!!!

import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.google.android.youtube.player.internal.ab
import java.util.*

class YouTubePlayerSupportFragmentX : Fragment(), YouTubePlayer.Provider {
    private val a = ViewBundle()
    private var b: Bundle? = null
    private var c: YouTubePlayerView? = null
    private var d: String? = null
    private var e: YouTubePlayer.OnInitializedListener? = null
    override fun initialize(var1: String, var2: YouTubePlayer.OnInitializedListener) {
    d = ab.a(var1, "Developer key cannot be null or empty")
    e = var2
    a()
}

private fun a() {
    if (c != null && e != null) {
        c?.a(this.activity, this, d, e, b)
        b = null
        e = null
    }
}

override fun onCreate(var1: Bundle?) {
    super.onCreate(var1)
    b = var1?.getBundle("YouTubePlayerSupportFragment.KEY_PLAYER_VIEW_STATE")
}

override fun onCreateView(var1: LayoutInflater, var2: ViewGroup?, var3: Bundle?): android.view.View? {
    c = YouTubePlayerView(Objects.requireNonNull(this.activity), null, 0, a)
    a()
    return c
}

override fun onStart() {
    super.onStart()
    c?.a()
}

override fun onResume() {
    super.onResume()
    c?.b()
}

override fun onPause() {
    c?.c()
    super.onPause()
}

override fun onSaveInstanceState(var1: Bundle) {
    super.onSaveInstanceState(var1)
    (if (c != null) c?.e() else b)?.let { var2 ->
        var1.putBundle("YouTubePlayerSupportFragment.KEY_PLAYER_VIEW_STATE", var2)
    }
}

override fun onStop() {
    c?.d()
    super.onStop()
}

override fun onDestroyView() {
    this.activity?.let { c?.c(it.isFinishing)  }
    c = null
    super.onDestroyView()
}

override fun onDestroy() {
    if (c != null) {
        val var1 = this.activity
        c?.b(var1 == null || var1.isFinishing)
    }
    super.onDestroy()
}

private inner class ViewBundle : YouTubePlayerView.b {
    override fun a(var1: YouTubePlayerView, var2: String, var3: YouTubePlayer.OnInitializedListener) {
        e?.let { initialize(var2, it) }
    }

    override fun a(var1: YouTubePlayerView) {}
}

companion object {
    fun newInstance(): YouTubePlayerSupportFragmentX {
        return YouTubePlayerSupportFragmentX()
    }
}
}
3。初始化YOUTUBE播放器支持片段

现在,您应该准备好YoutubePlayerSupportFragment

在确保这项工作正常后,您必须初始化youtubePlayer。您只需调用
youtubePlayerSupportFragment.initialize(apiKey,listener)
,就可以做到这一点。在括号内,您必须设置apiKey和侦听器。api密钥可以很容易地生成,如果没有,只需谷歌一下即可。对于听者,您可以按ctrl+shift+spacebar打开智能建议,它应该首先弹出。在我的例子中,它看起来像这样:

val youtubePlayerSupportFragment = YouTubePlayerSupportFragmentX.newInstance() 
            supportFragmentManager.beginTransaction()
                .add(R.id.main_player, youtubePlayerSupportFragment).commit()

youtubePlayerSupportFragment.initialize(
                    resources.getString(R.string.API_KEY), //IF YOU HAVE NO API KEY IT WONT WORK. But that's actually explained in the docs. So you can google it easily if you don't have one
                    object : YouTubePlayer.OnInitializedListener {
                        override fun onInitializationSuccess(
                            p0: YouTubePlayer.Provider?,
                            p1: YouTubePlayer?,
                            p2: Boolean
                        ) {
                            p1?.loadVideo("9ET6R_MR1Ag") // string has to be https://www.youtube.com/watch?v=----------->9ET6R_MR1Ag<---------
                        }

                        override fun onInitializationFailure(
                            p0: YouTubePlayer.Provider?,
                            p1: YouTubeInitializationResult?
                        ) {
                            layoutUtils.createToast(
                                applicationContext,
                                "ERROR INITIATING YOUTUBE"
                            )
                        }
                    })
override fun onInitializationSuccess(
                            p0: YouTubePlayer.Provider?,
                            p1: YouTubePlayer?,
                            p2: Boolean
                        ) {
                            p1?.loadVideo(video)
                            youtubePlayer = p1 // <------- this line here
                        }
当播放器成功启动时,按如下方式存储:

val youtubePlayerSupportFragment = YouTubePlayerSupportFragmentX.newInstance() 
            supportFragmentManager.beginTransaction()
                .add(R.id.main_player, youtubePlayerSupportFragment).commit()

youtubePlayerSupportFragment.initialize(
                    resources.getString(R.string.API_KEY), //IF YOU HAVE NO API KEY IT WONT WORK. But that's actually explained in the docs. So you can google it easily if you don't have one
                    object : YouTubePlayer.OnInitializedListener {
                        override fun onInitializationSuccess(
                            p0: YouTubePlayer.Provider?,
                            p1: YouTubePlayer?,
                            p2: Boolean
                        ) {
                            p1?.loadVideo("9ET6R_MR1Ag") // string has to be https://www.youtube.com/watch?v=----------->9ET6R_MR1Ag<---------
                        }

                        override fun onInitializationFailure(
                            p0: YouTubePlayer.Provider?,
                            p1: YouTubeInitializationResult?
                        ) {
                            layoutUtils.createToast(
                                applicationContext,
                                "ERROR INITIATING YOUTUBE"
                            )
                        }
                    })
override fun onInitializationSuccess(
                            p0: YouTubePlayer.Provider?,
                            p1: YouTubePlayer?,
                            p2: Boolean
                        ) {
                            p1?.loadVideo(video)
                            youtubePlayer = p1 // <------- this line here
                        }
override fun onInitializationSuccess(
p0:YouTubePlayer.Provider?,
p1:YouTubePlayer?,
p2:布尔型
) {
p1?加载视频(视频)

YouTubeplyer=p1//嘿,Owais!待在文档室[
YoutubePlayerView
只能在
YoutubeBaseActivity
中实例化,因此如果您只想使用片段进行导航,这可能不是一个可行的解决方案。
YoutubePlayerFragment
似乎满足了您的所有需求,为什么不能在导航图中使用它?它扩展了
片段
,所以它实际上应该像任何其他关于导航的片段一样:)嘿,Marino,你说的没错youtubePlayer片段应该像任何其他片段一样,因为它扩展了片段,但是当我试图在导航图的图形编辑器中将其添加为目标时,它没有被识别为片段。只是为了帮助fr为了更好地解决这个问题,您能否尝试创建一个扩展YouTubePlayerFragment的
VideoFragment
,并将其添加为导航图中的目的地,而不是直接使用YouTube的目的地?
override fun onInitializationSuccess(
                            p0: YouTubePlayer.Provider?,
                            p1: YouTubePlayer?,
                            p2: Boolean
                        ) {
                            p1?.loadVideo(video)
                            youtubePlayer = p1 // <------- this line here
                        }