gpt4 book ai didi

android - 如何在 android fragment 中实例化 YoutubePlayerView

转载 作者:行者123 更新时间:2023-12-02 13:29:36 25 4
gpt4 key购买 nike

我正在创建一个应用程序,它将从 youtube 加载视频。我遇到的问题是我无法弄清楚如何在 android fragment 中实例化 YoutubePlayerView,因为我的应用程序只有一个 Activity ,并且所有 UI 内容都是通过 fragment 和导航图管理的。

我唯一能想到的是在 YoutubeBaseActivity 中实例化 YoutubePlayerView,这会损害导航的一致性,因为它将是一个新的 Activity 。
我尝试创建一个 YoutubePlayerFragment,但无法将其设置为导航图中的目的地。
因此,如果有人能帮助我弄清楚如何做到这一点,我将不胜感激。 :)

提前致谢。

最佳答案

对于今天遇到此问题的任何人,这就是我所做的,它非常适用于 Activity 和 Fragment。
1. 放置框架布局
在您的 Activity 或 fragment XML 中,放置 FrameLayout .很简单。

   <FrameLayout
android:id="@+id/main_player"
android:layout_width="match_parent"
android:layout_height="0dp"/>
2. 实例化 YoutubePlayerSupportFragment 并将其添加到框架布局
输入下一行,如果您收到有关使用 android.support.v4.Fragment 的错误,您将不得不创建一个新的 YoutubePlayerSupportFragment 自定义类。我认为发生此错误是因为 YoutubePlayerSupportFragment 类从 android.support.v4.Fragment 扩展而来,而我使用的是 androidx,我不确定。尽管如此,我还是在点击监听器中执行此操作,但您可以在其他任何地方执行此操作,例如 onViewCreated()或在 onCreateView()
   val youtubePlayerSupportFragment = YouTubePlayerSupportFragment.newInstance()
supportFragmentManager.beginTransaction()
.add(R.id.main_player, youtubePlayerSupportFragment).commit()
// these lines of code populates the FrameLayout with a brand new YoutubePlayerSupportFragment
// this code is actually for an Activity. If you want to do it for a fragment, replace the `supportFragmentManager` for `childFragmentManager` and it should work as well. It does for me.
因此,如果这些代码行给您错误,您已经在 中创建了一个新类。这个确切的新路径 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()
}
}
}
第 36 行将保留红色下划线,但不要注意它。找不到解决它的方法,但它工作正常。
就我而言,我使用的是我的自定义类,所以我在上面输入的代码行结果非常相似:
   val youtubePlayerSupportFragment = YouTubePlayerSupportFragmentX.newInstance() //notice this is my custom class, it ends with an X
supportFragmentManager.beginTransaction()
.add(R.id.main_player, youtubePlayerSupportFragment).commit()
3.初始化YOUTUBE播放器支持 fragment
现在你应该准备好你的 YoutubePlayerSupportFragment 了。
在确定这有效后,您必须 初始化 youtube播放器。您只需调用 youtubePlayerSupportFragment.initialize(apiKey, listener) .在括号内你必须设置你的 apiKey 和一个监听器。 api key 可以很容易地生成,如果你没有,只需谷歌它。对于听众你可以做 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"
)
}
})
就是这样!很多工作,是的,但这是值得的。即使 api 文档写得不好并且有一些错误,它也能完美运行。但是对于用户来说,它看起来就像 youtube,所以它会给你的应用程序一个非常专业的外观。至少这是我在实现它时得到的反馈。
重要提示:
如果你想播放一个视频,并让用户能够在提示时播放其他视频,比如像 youtube 一样点击,你必须在初始化时将 youtubePlayer 存储在一个变量中。例如:
var youtubePlayer: YoutubePlayer? = null // this is a global variable of your class
并且当播放器成功启动后,像这样存储它:
override fun onInitializationSuccess(
p0: YouTubePlayer.Provider?,
p1: YouTubePlayer?,
p2: Boolean
) {
p1?.loadVideo(video)
youtubePlayer = p1 // <------- this line here
}
然后在你的代码的任何部分你可以做 youtubePlayer.loadVideo(anotherLink)它会自动停止当前视频并开始播放新视频。

关于android - 如何在 android fragment 中实例化 YoutubePlayerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62249792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com