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