Android向けKotlin

おそらく、Androidの開発に興味がある人のうち、怠け者だけがKotlinについて聞いたことがないでしょう。 既にそれについて書いたhabrについて: ここに記事がありますここにMBLTdevからのビデオがあります。 言語は活発に開発されていますが、新しい記事はまだありません。 私はそれを修正する時だと決めました。



この美しい言語で最近何が起こったのか、以前はHabrでカバーされていなかった機能に興味があるなら、猫をお願いします。



あんこ



間違いなく、Kotlinユーザーにとって非常に重要なライブラリであり、まだ開発中です(現在のバージョン0.6)。 その機能を検討してください。



あんこDSL


ご存じのとおり、xmlを使用するだけでなく、Javaコードで直接インターフェイスを作成できます。 しかし、この地獄の痛みはそれほど簡単ではありません。 Ankoライブラリは、Groovyのビルダーと多くの共通点を持つユーザーインターフェイスを作成する別の方法を提供します(ただし、Kotlinにも存在します)。

簡単な例として、標準のHelloWorldをxmlからAnko DSLに書き換えます。

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) relativeLayout { padding = dip(16) textView("Hello world!") { } } }
      
      





Anko DSLでxmlを書き換えたときに、これら5行を書いて、突然それがすべてだと気づいたとき、私自身が少し驚いたとは言えません。

同等のXMLマークアップ
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"> <TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
      
      







もちろん、このアプローチを使用して、より複雑なUIを作成することもできます。

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) relativeLayout { padding = dip(16) val w = dip(200) val loginEditId = 155; val loginEdit = editText { id = loginEditId hint = "Login" }.layoutParams { centerInParent(); width = w } button("Sign up") { textSize = 18f onClick { doWork(loginEdit.getText().toString()) } }.layoutParams { below(loginEditId); sameLeft(loginEditId); width = w; topMargin = dip(8) } } }
      
      





結果:





Anko DSLにはもう1つの興味深い機能があります-インターフェースの実装の削減です。 たとえば、標準のTextWatcherインターフェイスには3つのメソッドが含まれており、1つだけが必要な場合でも、すべてを実装する必要があります。

 val edit = EditText(this) edit.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { toast(s) } override fun afterTextChanged(s: Editable) { } })
      
      





Anko DSLを使用すると、必要なものだけを実装できます(可能な限り少ないコードを記述します)。

 val edit = editText { textChangedListener { onTextChanged { text, start, before, count -> toast(text.toString()) } } }.layoutParams { centerInParent() }
      
      







簡単な結論として、Anko DSLはxmlに代わるものではありますが、明確な置き換えではありません。 JavaコードからUIを作成する代わりになります。 Anko DSLは速度に明確な利点を与えません。そのため、パフォーマンスのために使用しないでください。



私の意見では、要素のプロパティとイベントハンドラーの両方を1か所に記述するので、Anko DSLの使用は良いです(通常、要素のスタイル/配置は通常xmlを使用して行われ、イベントハンドラーはJavaコードで割り当てられます)-これロジックにプラスを与えることができます。 さらに、ファッショナブルなMVPパターンでAnko DSLを使用してみてください。



また、誰かにとって、そのようなビルダースタイルはxmlよりも楽しい可能性があります。

もう一つの重要なポイント-アンコは開発中です。 おそらく将来、このライブラリから新しいクールな機能が登場するでしょう。 したがって、それに注意を払う価値があります。



あんこ機能


DSLに加えて、Ankoライブラリを使用すると、はるかに少ない標準コードを記述できます。

いくつかのコードスニペットと、Ankoでそれらを変更する方法を見てみましょう。 私は単に例を挙げます-私の意見では、コメントは不要です。



したがって、Ankoライブラリは、間違いなくKotlinプロジェクトに役立つ一連の便利な機能を提供します。 どうぞ

 compile 'org.jetbrains.anko:anko:0.6.1-19s'
      
      





愛をこめてAndroidに



KotlinチームがAndroidの名の下に一生懸命働いており、Android開発者にとって非常に重要な機能を言語に追加していることは言うまでもありません。



注釈処理


ほんの数日前、Android開発者はKotlinと組み合わせてさまざまなDIフレームワークを使用する機会をようやく得ました。 このため、詳細の一部を説明する記事がKotlin開発者ブログに掲載されました。 さらに、Daggerを使用した例を見ることができます。 これまでのところ、この機能はまだ湿っていて、さらに開発されますが、一般的な方向性は満足です。

上記のリンクに何か役に立つものを追加できるとは思わないので、この項目はニュースのようになります。



二次コンストラクター


当初、Kotlinはクラスごとに1つのプライマリコンストラクターのみを使用することを計画していました。 これは、これで常に十分であるという事実によって議論されました。 一般的に、これはほとんど常に真実です。 ただし、この制限により、Android開発者は独自のViewクラスを作成できませんでした。

今では可能です:

 public class MyView : LinearLayout { public constructor(context: Context) : super(context) { } public constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { } //... }
      
      





当然、セカンダリコンストラクターの使用は、Viewクラスのみに限定されません。



委任されたプロパティ


一般に、委任はAndroid専用に作成されたものではなく、この機能はM5.3言語のバージョンに登場しましたが、このトピックはまだHaberでカバーされていないため、それに触れます。



このコンテキストでの委任とは、フィールド/変数処理を特定のクラスに渡すこと意味ます。 このクラスには、このフィールドのgetおよびsetメソッドが含まれます。 この転送により、次のようないくつかの概念を実装できます。



Kotlinは、DelegatesオブジェクトのDelegation.ktファイルにある標準の重要なデリゲートのセットを定義します。 たとえば、遅延初期化を非常に簡単に使用できます。

 val someBigValue by Delegates.lazy { var result = BigInteger.ONE //some hard computations result }
      
      





someBigValueフィールドに初めてアクセスすると、その値が計算されて保存され、2回目と次回は保存された値が返されます。

注:このコンストラクトを使用してさまざまなシングルトンを作成しないでください ;このため、Kotlinにはオブジェクト宣言があります

ドキュメントで他の例を見つけることができます。



Androidのすばらしい委任とは何ですか? Kotlinの重要な機能の1つであるnull安全性を思い出します。 通常、UI要素は、たとえば次のようにアクティビティ/フラグメントフィールドとして宣言します。

 private var mHelloWorldTextView : TextView = //???
      
      





ただし、Kotlinでは、TextViewタイプフィールドをnullに設定できません。 したがって、次のように記述します。

 private var mHelloWorldTextView : TextView? = null
      
      





しかし、これは "?。"が広く使用されているため、怖い構成になります。 および「!!。」は、コードに美しさを追加しません。

 override fun onCreate(savedInstanceState: Bundle?) { //... mHelloWorldTextView = findViewById(R.id.helloWorldTextView) as TextView? mHelloWorldTextView?.setOnClickListener { /*...*/ } val text = mHelloWorldTextView!!.getText() }
      
      





そして、デリゲートオブジェクトの非常に便利なメソッドnotNullが助けになります。

 private var mHelloWorldTextView : TextView by Delegates.notNull() override fun onCreate(savedInstanceState: Bundle?) { //... mHelloWorldTextView = findViewById(R.id.helloWorldTextView) as TextView mHelloWorldTextView.setOnClickListener { /*...*/ } val text = mHelloWorldTextView.getText() }
      
      





初期化する前にmHelloWorldTextフィールドにアクセスしようとすると、IllegalStateExceptionが発生します。 Java 8のオプションと非常によく似ています。



UPD 1。

アクティビティでは、代替オプションを使用できます。

 private val mHelloWorldTextView : TextView by Delegates.lazy { findViewById(R.id.helloWorldTextView) as TextView }
      
      





ユーザーSp0tted_0wlに感謝



UPD 2。

一般に、ViewではKotlin Android Extensionsを使用します

アブレスラヴキブシアクに感謝



おわりに



これで、Android開発用のKotlinの主な興味深い機能についての私の説明は終わりです。 最後まで読んでくれてありがとう。

コトリンを学び、コトリンに書いて、コトリンが大好き!



PS Slack でAndroid開発者の世界最大のコミュニティに参加してください。

PPS Kotlinに興味がある他の開発者とチャットしたいですか? Gitter へようこそ



All Articles