我刚刚将Android Studio更新到了3.2版,并按照说明使用了androidx。
我一直在Fragment活动中使用Youtube片段,并且一切运行正常,但是在更新之后,这3条简单的行现在给我错误“无法解析方法'add(...)'”:>
gsub("C[0-9]\\- ", "", PastActivity$Name)
...并且当我尝试使用“替换”而不是“添加”时,它说:“第二个参数类型错误。找到:'com.google.android.youtube.player.YouTubePlayerSupportFragment',必填:'androidx。 fragment.app.Fragment'“
...这让我认为问题与新的AndroidX功能有关。
问题在于add方法想要第二个参数类型:
YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
...但是YouTubePlayerSupportFragment返回一个:
androidx.fragment.app.Fragment
有人知道如何解决这个问题吗? 有没有办法将“ android.support.v4.app.Fragment”转换为“ androidx.fragment.app.Fragment”?
答案 0 :(得分:2)
我已经按照@Hosszful的答案进行了修复, 我通过使用https://gist.github.com/medyo/f226b967213c3b8ec6f6bebb5338a492
这个文件使操作变得简单答案 1 :(得分:2)
替换 .add
transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
与此 .replace
transaction.replace(R.id.youtube_fragment, youTubePlayerFragment).commit();
并将this类复制到您的项目文件夹中(可能需要创建以下文件夹)
java-> com-> google-> android-> youtube->播放器->(此处为) YouTubePlayerSupportFragmentX.java
然后用代码替换
YouTubePlayerSupportFragment
至
YouTubePlayerSupportFragmentX
。
答案 2 :(得分:1)
只需使用transaction.replace
。忽略该错误,它将起作用。 Google尚未将youtube api库重构为androidx
。
答案 3 :(得分:1)
只需将原始Java文件(com.google.android.youtube.player.YouTubePlayerFragment
)复制到您的项目中,并复制到相同的包中,但使用不同的类名,例如com.google.android.youtube.player.YouTubePlayerFragmentX
,然后将扩展类从android.app.Fragment
更新为{{1 }}。
实现相同:
androidx.fragment.app.Fragment
经过测试...正在运行。
答案 4 :(得分:1)
我通过遵循代码块使其工作。
Object obj =
getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment);
if (obj instanceof YouTubePlayerSupportFragment)
youTubePlayerFragment = (YouTubePlayerSupportFragment) obj;
在调试过程中,我发现fragmentmanager仅成为YouTubePlayerSupportFragment的实例。但是我编写
时,编译器无法进行转换(YouTubePlayerSupportFragment)
getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment);
上面的代码块( instanceof )工作正常。
答案 5 :(得分:1)
非常感谢@Hosszuful和@Mehdi。我听了你的建议,效果很好。
问了这个问题几周后,我将我的应用“翻译”成了Kotlin,因此,我也尝试翻译您的答案。
这就是我最终得到的结果,并且对我有用。
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()
}
}
}
可能有更好的方法将其写下来,对此方面的任何帮助将不胜感激,但是,如果其他人正在寻找该问题解决方案的Kotlin版本,则此代码应该有用。
PS:我要把@Mehdi的答案留为被接受的原因,因为他也与@Hosszuful分享积分,并且因为我的答案只是他们建议的Kotlin版本。
答案 6 :(得分:0)
建议的解决方案没有奏效,直到我尝试了来自 Bek: Pierfrancesco Soffritti's android-youtube-player 的评论,该评论得到维护并且工作顺利。