Kotlin for Androidで曞く

箄2幎前、Androidマヌケットには、さたざたなプロゞェクトに費やされた時間を远跡するのに䟿利なアプリケヌションがないこずを発芋したした。 本物のアむドラヌのように、必芁なものを怜玢するのではなく、自分で䜜成するこずにしたした。 圓初よりも少し耇雑であるこずが刀明し、 私はすべおを緩慢な趣味モヌドで攟棄したした。私の欲望の具珟化は、アむデアからアルファ版にゆっくりず移行し、1幎以䞊生きたした。

そしお、突然、善良な人々は、Kotlin'e䞊のAndroidでの曞き方を教えおくれるこずを提案したした。 これは良い兆候であるように思えたので、Kotlinでアプリケヌションをすばやく曞き盎し、終了しおGoogle Playに掲茉したした。

重芁な説明この蚘事は、Kotlin'eでAndroid向けに䜜成する方法に぀いおのみ説明しおいたす。 Kotlinを詊しおみたい人、そしおKotlinを詊しおみたい理由を理解したい人だけが興味を持ちたす。 私が曞いたアプリケヌションは非垞に単玔ですそれ自䜓、JetBrainsにはたったく適甚されたせん。 圌のコヌドで䜕かを改善できるずいう保蚌がありたす。それは䟋ずしおのみGithubに投皿されおおり 、驚くべきコヌドのサンプルずしおではありたせん。 動䜜したす 。詊しおみたい堎合は、ここから配眮できたす 。 しかし、繰り返したすが、これはデモであり、その目的は完璧なアプリケヌションではなく、Kotlin for Androidの玹介です。

繰り返したすが、䜕か新しいものです。 そしお、なぜ私はそれを知る必芁がありたすか




最も興味深いものを遅らせないために、Kotlin'aの最も重芁な利点のみに蚀及したす。

Kotlin'eでは、Jav'eよりもはるかに高速に曞くこずができ、私の意芋では、コヌドはより矎しいです。

ちなみに、github'eには、Kotlin'eのコヌドを含む200以䞊のリポゞトリが既にありたす。モバむルアプリケヌションに぀いお蚀えば、KotlinはTelegramメッセンゞャヌの開発に䜿甚されたした。

それでは、どこから始めたすか


動䜜するには、IDEが必芁です。 明らかな理由から、私はIntelliJ IDEAを奜みたすが、JetBrainsはEclipse甚のKotlinプラグむンも䜜成し、vimの愛奜家は別の蚀語コンパむラを䜿甚できたす。

さらに、AndroidでビゞネスでKotlinを詊しおみたい人は誰でもIntelliJ IDEAを䜿甚するず仮定したす。 動䜜させるには、Kotlinプラグむンをむンストヌルし、コンピュヌタヌにgradleずAndroid SDKがあるこずを確認する必芁がありたすこれはKotlin'yずは関係ありたせん。これはAndroidの開発に必芁です。

Javaが最初でした


完成するこずにしたずき、私はすでに郚分的に曞かれたアプリケヌションを持っおいたした。 すべおがJavaで曞かれおいたす。

アプリケヌションの本質画面に赀いタスクのリストがあり、タスクをクリックするず緑色に倉わり、時間が経過したこれはナヌザヌがタスクに取り組んでいるこずを意味したす。 圌が停止したずき、圌は再びそれをクリックし、タスクが再び赀面し、圌がどれだけの時間を費やしたかを瀺したす。 アプリケヌションは、䜕もチェックせずに盲目的にナヌザヌを信頌したす。これは、oDeskの「兄貎があなたを芋おいる」ずいうこずではありたせん。

同じプロゞェクトでJavaずKotlinの䞡方のコヌドを䜿甚できるずいう事実にもかかわらず、私がJavaで曞いたものをKotlinに曞き盎したかったのです。私の魂はKotlinの100コヌドを芁求したした。 継承されたコヌドを䜿甚するず、すべおが単玔であるこずがわかりたした。src / main / javaの次に、 src / main / kotlinフォルダヌを䜜成し、その䞭にクラスを配眮したす。 Kotlinのファむルは.javaではなく.ktで終わりたす。 ここで、楜しい瞬間が敎ったこずが刀明したした。Kotlinは、「1぀のクラス-1぀のファむル」ずいう察応を必芁ずしたせん。 アプリケヌションロゞックに埓っお、奜きなだけ倚くのクラスを1぀のファむルに詰め蟌むこずができたす。 私のアプリケヌションでは、デヌタベヌスの操䜜ず画面䞊のナヌザヌむンタヌフェむスの2぀の論理郚分だけがあり、ファむルの数を枛らすこずができたした。

IntelliJ IDEA甚のKotlinプラグむンは、JavaからKotlinぞの適切な倉換を実行するこずにより、 .javaファむルを.ktファむルに倉換できたす。 これは、ファむルずコンテキストメニュヌを右クリックするか、Javaコヌドを.ktファむルにコピヌするずきに行うこずができたすプラグむンは倉換できるかどうかを尋ねたす。

Kotlin'eにコヌドを曞きたす


Kotlinコヌドはコンパクトです。たずえば、コンストラクタヌずゲッタヌ/セッタヌを含むクラスは次のように蚘述されたす。

class Item (val project: String, var status: String, var secondsSpent: Long, var lastactivated: Long) 


ボタンをクリックしおテキストを入力するためのダむアログを䜜成するコヌドを芋おみたしょう。

Java
 addButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { AlertDialog.Builder alert = new AlertDialog.Builder (this); alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result = input.getText().toString() } }); } } 


コトリン
 addButton.setOnClickListener() { var alert = AlertDialog.Builder(this); alert.setPositiveButton("") { dialog, whichButton -> result = input.getText().toString() } } 


同意しお、Kotlin'eのコヌドは読みやすいです。 泚意深い読者にずっおは、これはもちろん、ダむアログを䜜成するずきに[OK]ボタンだけでなく[キャンセル]ボタンも必芁なため、これはコヌドの䞀郚にすぎないこずに泚意しおください。 コヌドはGithubに完党にアップロヌドされたす。

コヌドを短くできるのはなぜですか たずえば、Kotlinでは、この圢匏の蚘述が可胜です。匕数ずしお、1぀の抜象メ゜ッドを持぀クラスのむンスタンスが必芁な堎合は、そこにラムダを単玔に枡すこずができたす。これは䞊蚘の䟋に瀺されおいるずおりです。

Kotlin'eでは、代入の右偎から掚枬されるため、倉数の型を省略できるこずに泚意しおください。

Javaコトリン
AlertDialog.Builder alert = new AlertDialog.Builderthis;val alert = AlertDialog.Builderこれ

Kotlin'eの構文の興味深い機胜パラメヌタヌが関数に枡され、最埌のパラメヌタヌが関数である堎合、角括匧から倖すこずができたす。 これはたさにフラグメントに芋られるもので、ラムダがsetPositiveButtonに枡され、OKボタンを抌すこずで機胜したす。

 alert.setPositiveButton("") { dialog, whichButton -> result = input.getText().toString() } 

同じように曞くこずができたす

 alert.setPositiveButton("", { dialog, whichButton -> result = input.getText().toString() } ) 

読みやすいオプションを自由に遞択できたす。

KotlinコヌドでのJavaラむブラリの䜿甚

もう1぀の良い点は、KotlinコヌドからJavaで蚘述されたラむブラリを盎接䜿甚できるこずです。

たずえば、SQLiteで保存するずきにプロゞェクト名の特殊文字ずUnicodeを適切に凊理するために、䞀般的なラむブラリのStringEscapeUtils.escapeJavaおよびStringEscapeUtils.unescapeJava関数を䜿甚したした。 これらの関数はimportステヌトメントでむンポヌトするだけですプロゞェクトプロパティに入力したす。

 import org.apache.commons.lang3.StringEscapeUtils 

戻り倀

Kotlinでは、関数リテラルは最埌の匏で蚈算された倀を返すため、関数リテラル別名ラムダ関数でreturnを䜿甚するこずは犁止されおいたす。 そのため、 setOnTouchListenerの呌び出しでは、呌び出しの最埌のパラメヌタヌはbooleanを返す関数であるこずが期埅されたす。 この倀は、実際にgestureDetector.onTouchEventaEventを返したす。

Java
 gestureListener = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } }; 

コトリン
 getListView()?.setOnTouchListener() { v, aEvent -> gestureDetector.onTouchEvent(aEvent) } 

Kotlin関数リテラルコヌドでreturn GestureDetector.onTouchEventaEventを蚘述するこずはできたせん。gestureDetector.onTouchEventaEventを呌び出した結果はこの方法で返されたす。

実際、関数リテラルで非ロヌカルリタヌンを䜿甚する必芁がある特殊なケヌスがありたす。 興味がある堎合、詳现に぀いおはKotlinのドキュメントを参照しおください。


「=」蚘号で定矩された関数による倀の戻りは、次のように同様に機胜したす。

 override fun getCount() = data.size() 

文字列パタヌン

読み取りが難しく、最適でないバむトコヌドを䞎える長い文字列を取り陀くために、Kotlin'eで文字列テンプレヌトが䜿甚されたす。

 setMessage(" $projectToDelete?") 

ここで、projectToDeleteは文字列倉数です。 このようなパタヌンの構文は、たずえばUNIXで環境倉数を扱っおいる人なら誰でも知っおいたす。 特に䟿利なのは、テキストず倚くの倉数の倀で構成された文字列甚のテンプレヌトであり、曞匏蚭定も可胜です。

 secondsSpent.setText("${format("%02d", hours)}:${format("%02d",minutes)}:${format("%02d", seconds)}") 

ちなみに、興味深い話がフォヌマットを思い付きたした。KotlinのStringのタむプは独自のものであり、 フォヌマットメ゜ッドはありたせん。したがっお、 java.lang.String.formatを明瀺的にむンポヌトし、そのように参照する必芁がありたした。 驚くべきこずに、ずころで、JavaたたはKotlin'eには、秒の敎数をフォヌマット文字列に倉換するsecondsToHumanReadableStringメ゜ッドがただありたせん。
  HHMMSS。 

い぀、ず

耇数遞択の堎合 、およびメ゜ッドずプロパティの呌び出しを枛らす堎合に䜿甚するず非垞に䟿利です。どちらもAndroid甚の小さなアプリケヌションでも十分です。 私の堎合、これは読みやすいコヌドを提䟛したした。䟋えば

 with (alert) { setPositiveButton("") { dialog, whichButton -> ...      ... } setNegativeButton("") { dialog, whichButton -> } //  ""      create() show() } 

を䜿甚しない堎合、 alert.setPositiveButton、alert.setNegativeButton、alert.create、alert.showは刀明したす。 読みやすさも向䞊する堎合

 when (item.status) { "active" -> { item.status = "inactive" ...      ... } "inactive" -> { item.status = "active" ...     ... } } 

Gradleでコンパむルする


build.gradleを手で䜜成したり、IDEなしでgradleでプロゞェクトをビルドしたりする堎合は、 Kotlinlang.orgで 友人をgradle 、Kotlin、Androidにする方法を読んでください 。

Android Studioナヌザヌにこのような問題があるかどうかはわかりたせんが、Gradleで䜜業しおいるIntelliJ IDEAに粟通しおいる人にずっおは、デバッグではなくリリヌス甚に.apkをアセンブルする方法が問題になる堎合がありたす。

このため、IDEAにはGradleプラグむンがあり、右偎のタブをクリックするず開きたす。



デフォルトでは、IDEAは* -debug-unsigned.apkを収集したす 。 Google Playに眮くこずができないもの。 * -release-signed.apkにするには、眲名キヌを生成しおキヌストアに配眮し、プロゞェクトのbuild.gradleに数行を入力しお、Gradleがキヌを取埗する堎所を知る必芁がありたす。 リリヌスをビルドするには、GradleりィンドりでassembleReleaseタスクをダブルクリックしお遞択したす。

キヌを䜜成しおアプリケヌションに眲名する方法に぀いお既に知っおいるか、stackoverflowで詳现を読むこずができたす 。

ご泚意


最近、Jekyll + GithubでホストされるKotlin kotlinlang.orgに関する新しいサむトを開きたした。 この決定が良いこずよりも、最近Habréですでに曞いおいたす。

蚘事でいく぀かのコヌド䟋が芋栄えがよければ 、これはKotlinチヌムで働いおいるNatalya Ukhorskayaの間違いないメリットです。 Natashaには、この蚘事が短くなり、コヌドが叀兞的なKotlinに䌌おいないずいうアドバむスがなかったこずに非垞に感謝しおいたす。

ビヌチでコトリンを䜿甚しお節玄した時間を過ごすこずができれば、私たちはずおも幞せです。 倏の良い䌑息 

07/31 / 14、18  55からのUPD 䞀郚の甚語ず文蚀が修正されたした。

Source: https://habr.com/ru/post/J231525/


All Articles