YouTube播放器支持片段不再适用于Android Studio 3.2(androidx)

时间:2018-09-30 10:24:16

标签: youtube androidx

我刚刚将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”?

7 个答案:

答案 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

enter image description here

然后用代码替换

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 的评论,该评论得到维护并且工作顺利。