我想为Android创建一个scala Views帮助器
使用这种特质和阶级的组合
class ScalaView(view: View) {
def onClick(action: View => Any) =
view.setOnClickListener(new OnClickListener {
def onClick(view: View) {
action(view)
}
})
}
trait ScalaViewTrait {
implicit def view2ScalaView(view: View) =
new ScalaView(view)
}
我能够像这样编写onClick()
class MainActivity extends Activity with ScalaViewTrait {
//....
val textView = new TextView(this)
textView.onClick(v => v.asInstanceOf[TextView] setText ("asdas"))
}
我担心的是我想避免将v转换为TextView
如果应用于LinearLayout,则v将始终为TextView,如果应用于TextView LinearLayout,依此类推.
是否有任何方法可以将v动态转换为应用的任何视图?
刚开始使用Scala,我需要你的帮助.
UPDATE
解决了,请看下面的答案
解决方法:
这里的问题是,鉴于Android API,您根本不可能拥有完整的类型安全性以及定义仅适用于View的相关子类的操作的便利性.
你的方法牺牲了类型的安全性,而drexin的牺牲(一些)方便.和你一样,我愿意在这种情况下放弃类型安全,因为期望从Android库中获得良好的行为是合理的,但我会将不愉快的内容略有不同.
首先,我为OnClickListener定义一个包装器,如下所示:
case class MyOnClickListener[V <: View](action: V => Any)
extends OnClickListener {
def onClick(view: View) = try action(view.asInstanceOf[V]) catch {
case e: ClassCastException =>
throw new RuntimeException("This should never happen!", e)
}
}
然后忘记OnClickListener存在(或者至少从不在我的代码中的任何其他位置使用它).现在所有非类型安全的东西捆绑在一个地方,我的ScalaView类是干净的,例如:
class ScalaView[T <: View](view: T) {
def onClick(action: T => Any) =
view.setOnClickListener(MyOnClickListener(action))
}
您可能会遇到需要这种包装的其他地方,这种方法可以让您将所有丑陋的演员表等小心地包含在一个地方,而不是分散在整个代码中.
原文地址:https://codeday.me/bug/20190529/1181792.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。