Pull to refresh

Добавление поддержки Scala за несколько кликов в ваш Android-проект(Eclipse)

Reading time 3 min
Views 5.7K
В этом постеце на заметку я покажу как можно добавить в Eclipse, в существующий проект поддержку языка — Scala. И так, поехали!

На хабре уже были посты на данную тематику. Например:
вот этот
Но душа всегда просит как можно более простого решения. В отличие от большинства способов, основанных на Ant или другом гемморое, который нужно проделать, чтобы добавить поддержку Scala, данный способ очень прост и быстр. А поможет нам в этом замечательный плагин к Eclipse — Treeshaker

И так, что нужно сделать?
Для тех, кто не хочет читать доку опишу установку и один нюанс, возникший у меня.

  • У вас уже должна быть настроена среда(Eclipse+плагин от гугла) для разработки под Андроид. Нужно установить плагин(Scala IDE). Заходим в пункт Eclipse Help->Install New Software, добавляем сайт к списку: download.scala-ide.org/releases-28/2.0.0-beta и жмем Next, ну и т.д.
  • Далее, по той же схеме как в пункте выше устанавливаем TreeShaker, а в качестве адреса сайта добавляем: treeshaker.googlecode.com/svn/trunk/update_site

Вот и все! Мы установили все нужное.

Теперь посмотрим как этим пользоваться.
  1. И так, создаем новый Андроид-проект
  2. Нажав правой кнопкой мыши на проект, в пункте Configure выбираем подпункт Add Scala Nature. И, о чудо! Scala — библиотеки добавились в проект
  3. Далее, снова нажимаем правой кнопкой мыши на проект и видим в списке пункт Add/Remove TreeShaker


Далее, убираем наш ява-код, а вместо него вставляем следующий:
import android.os.Bundle
import android.view.View
import android.widget.TextView
import android.widget.Button
import android.app.Activity
import R._
 
class ThreeShakerTutorialActivity extends Activity {
    lazy val textView = findViewById(R.id.text).asInstanceOf[TextView]
    lazy val button = findViewById(R.id.button).asInstanceOf[Button]
 
    override def onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)
        button.setOnClickListener((v: View) => textView.setText("Hello Scala"))
    }
 
    implicit def func2OnClickListener(func: (View) => Unit) = {
        new View.OnClickListener() {
            override def onClick(v: View) = func(v)
    }   }
}

В макет main.xml, в LinearLayout добавляем Button и TextView c указанными в коде id-шниками(разметка есть в вики на гуглокоде, а я боюсь хабрапарсера). Все готово!

Все бы хорошо, но есть одно НО. А именно, код

button.setOnClickListener((v: View) => textView.setText("Hello Scala"))

выдает ошибку компиляции. Исправляем так, но это плохой способ:
button.setOnClickListener(func2OnClickListener((v: View) => textView.setText("Hello Scala")))


А правильный такой, данный код оставляем как есть:
button.setOnClickListener((v: View) => textView.setText("Hello Scala"))

а вносим правку в определение метода:
implicit def func2OnClickListener(func: (View) => Unit): View.OnClickListener = {
        new View.OnClickListener() {
                override def onClick(v: View) = func(v)
        }
}


Спасибо хабраюзеру romik за эту подсказку.

Хотя Scala я пока что не знаю на хорошем уровне, но интуиция — великая штука! Странно как-то, что авторы не заметили этот момент!
Знающие люди могут объяснить почему там ошибка, но думаю авторы примера что-то явно забыли.

Важно убедиться, чтобы в свойстве проекта Builders были все указанные ниже пункты:
  • Android Resource Manager
  • Android Pre Compiler
  • Scala Builder
  • Treeshaker
  • Android Package Builder

Иначе, после компиляции и запуска проекта на эмуляторе будет эксепшн ClassNotFound.
Демо проект — здесь
Tags:
Hubs:
+15
Comments 11
Comments Comments 11

Articles