【问题标题】:How to call extension object inside companion from another class using kotlin?如何使用 kotlin 从另一个类调用同伴内部的扩展对象?
【发布时间】:2020-09-17 09:25:39
【问题描述】:

我想使用 Exoplayer 制作播放视频,但我在如何访问我的扩展功能方面遇到了一点问题。

import com.google.android.exoplayer2.ui.PlayerView

class playerViewadapter {
    companion object{
      fun PlayerView.loadView(){
      }
   }
}

但我的AppCompatActivityloadView 扩展名不显示

class Test:AppCompatActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.test)
        playerViewadapter.loadView()
    }
}

如何从我的 AppCompatActivity 调用 loadView

【问题讨论】:

    标签: android android-studio kotlin kotlin-android-extensions


    【解决方案1】:

    你必须在对象的上下文中才能调用它。

    with(playerViewadapter) { }playerViewadapter.apply { } 应该这样做:

    例子:

    with(playerViewadapter) {
        playerView.loadView()
    }
    

    Try it yourself

    【讨论】:

    • @AkbarGrunge 你是什么意思?
    • PlayerView 来自 import com.google.android.exoplayer2.ui.PlayerView
    • @AkbarGrunge 我知道它在那里声明,我发布了一个最小的例子来展示它。您遇到了什么问题?
    • 其实我想做这样的[github.com/MostafaAnter/VideoPlayerInsideRecyclerView].但是这个应用程序基于数据绑定。我想在不使用数据绑定的情况下进行转换。您可以在文件 PlayerViewBindingAdapter.kt 上看到
    • @AkbarGrunge 如果您不使用数据绑定,那么您必须使用findViewById 获取 PlayerView 对象:findViewById<PlayerView>(R.id.yourPlayerViewId) 然后调用loadView()
    【解决方案2】:

    为什么在另一个类的伴生对象中定义扩展函数?在你有PlayerView的文件中定义它不是更好吗,或者如果它不是你的类,为utils函数创建一个新文件?

    class PlayerView
    {
    }
    
    fun PlayerView.loadView()
    {
    }
    

    然后你就可以调用这个函数了:

    val playerView = PlayerView()
    playerView.loadView()
    

    【讨论】:

    • 其实我想做这样的 [github.com/MostafaAnter/VideoPlayerInsideRecyclerView]。但是这个应用程序基于数据绑定。我想在不使用数据绑定的情况下进行转换。您可以在文件 PlayerViewBindingAdapter.kt 中查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多