微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – Scala隐式动态转换

我想为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))
}

您可能会遇到需要这种包装的其他地方,这种方法可以让您将所有丑陋的演员表等小心地包含在一个地方,而不是分散在整个代码中.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐