(このエントリーはKotlin Advent Calendar 2014 - Adventarの21日目の記事です!)
KotlinやらないKotlinアイドルですが、
24歳、このままKotlinをやらずに20代後半に足を踏み入れていいのか自問し、
ついにKotlin童貞を捨てる事にしました。
あと、ついでにAndroid童貞も捨てます。
しょぼちむ Advent Calendar 2014 - Adventarの12日目、@grimroseさんの
open build/reports/life/index.html: しょぼちむさんがKotlinをやらない理由を考えてみたの記事に、こう↓かいてあったので、とりあえずJetBrains/kotlin · GitHubにスターつけるとこから始めた。
よし。いい滑り出しです。
宿題はぎりぎりまでやらないタイプなので、21日から始めてみる(震え)
Android Studioをダウンロードする
Installing the Android SDK | Android DevelopersからAndroidStudioをダウンロードしてインストールした。
うおおお
とりあえず出てくる質問にはいはいと答えていく。
ダウンロードはじまた。
めっちゃ時間かかる(^q^)
プロジェクトを作成する
PJを新規作成する。
適当に答えてみる。
なんかできた!!!
動かしてみる
エミュレーターを動かしてみるとエラー出た
/Users/syobochim/Library/Android/sdk/tools/emulator -avd Android-L -netspeed full -netdelay none emulator: ERROR: This AVD's configuration is missing a kernel file!!
うごかない。
ぐぐってみたら、SDKが足りていないエラーのようなので、ダウンロードしてみる。
ダウンロード、めっちゃかかる(・−・)
ダウンロード完了して再度実行!!
/Users/syobochim/Library/Android/sdk/tools/emulator -avd Android-L -netspeed full -netdelay none emulator: ERROR: This AVD's configuration is missing a kernel file!!
なおらない…。キレそう…。
なら実機だ!!!
Android Studioでアプリを実機で動作確認する - Android Studioでアプリ開発!を見ながら設定する。
Run!
うおおおおお!!!
Kotlin 童貞すてるで!!!!
Kotlinやらずして過ごした約1年半…?ついにKotlin童貞を捨てる。
Kotlinやらないがアイデンティティなので、最後まで悩んだが捨てる。捨てたるんや!!!
まず、デフォルトでできるJava
package com.example.syobochim.syobochimapp; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
Kotlinファイルを作成すると、ポップアップが出る。
ので、Pluginをインストールする。
よしよし。
再起動すると、こういうのでてきた。
従ってみたら、build.gradleが変わった!!!うおおお!!
src/mainフォルダの下にkotlinディレクトリを作ると、srcパスがすでに通っている!!
Kotlinファイルをそこに移動させる。
とりあえずデフォルトのMainActivityと同じことをさせてみたいので、
8.2 Androidアプリ開発 - プログラミング言語Kotlin 解説を見ながら見よう見真似で書いてみる。
package com.example.syobochim.syobochimapp import android.app.Activity import android.os.Bundle import android.view.Menu import android.view.MenuItem class MainActivity() : Activity() { override fun onCreate(saveInstanceState: Bundle?) { super.onCreate(saveInstanceState) setContentView(R.layout.activity_main) } override fun onCreateOptionsMenu(menu : Menu): Boolean { getMenuInflater().inflate(R.menu.menu_main, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { val id = item.getItemId() if (id == R.id.action_settings) { return true } return super.onOptionsItemSelected(item) } }
もともとあったJavaファイルを削除して実行してみる。
なんかうまくいったっぽい!!?
(文法しらない割に、さらっと書けてしまうのイイ!!!)
そして、Kotlin童貞捨てたぜ!!!!!!!
とりあえず文字を表示させたい
時間がないので、やりたいことベースで調べていく!!
いまのところHello Worldしか表示されていないので、とりあえず好きな文字を表示したい。
「Hello world」を作成してみる。 - 素人のアンドロイドアプリ開発日記をみて、文字列を変えてみる。
onCreateの中身を変更した。Kotlinはインスタンス生成するときにnew書かなくてもいい。
override fun onCreate(saveInstanceState: Bundle?) { super.onCreate(saveInstanceState) val helloSyobochim = TextView(this) helloSyobochim.setText("syobochim app だぜー!!!") setContentView(helloSyobochim) }
やったぜー!!!
ボタンをつけてみる
ボタンをつけてみる。
アンドロイドアプリでクリックイベントを取得 - 素人のアンドロイドアプリ開発日記
ふむふむ。
activity_main.xmlにボタンを追加すればええんやな。。。
?!!?!!!!
あ、、れ????なんかエラーでて画面が表示されない…。
ぐぐったけどわからない助けて…。
activity_main.xmlにとりあえず、ボタンを追加してみる…。
<Button android:text="Button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button01" > </Button>
で、Kotlinにも処理を書いてみる。
変数はvarで宣言。
nullかもしれない場合は型に?をつける。
キャストする場合は「as 型」!
OnClickListenerをImplementsする必要があった。Kotlinでは多重継承できる!
ただし、superクラスがどちらのクラスを指しているのかわからなくなってしまうので、ジェネリクスをつけてそのクラスを指しているのか明確にする必要がある。
class MainActivity() : Activity() , View.OnClickListener { var btn : Button? = null override fun onCreate(saveInstanceState: Bundle?) { super<Activity>.onCreate(saveInstanceState) setContentView(R.layout.activity_main) btn = findViewById(R.id.button01) as Button btn?.setText("オラオラオラ!!") btn?.setOnClickListener(this) } override fun onClick(v: View) { if (v == btn) { btn?.setText("おしたぜーーーー!!!!") } }
うん。なんかうしろに文字列みえてるけどだいじょうぶ。まだあわてる時間じゃない。
ボタンを押した時の動作を追加した
activity_main.xmlでレイアウトを作れないことが悲しい+時間がないので、別プロジェクトを新規作成して、レイアウトを作って、xmlのなかみだけもらうことにした。
これはいける気がしてきた…!!!
Clickイベントの時に文字を取ってきて追加!は余裕でできた!!
package com.example.syobochim.syobochimapp import android.app.Activity import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.widget.TextView import android.widget.Button import android.view.View import android.widget.EditText class MainActivity() : Activity(), View.OnClickListener { var btn: Button? = null var printText: TextView? = null var editText: EditText? = null var talk = StringBuilder("しょぼちむだよー!") override fun onCreate(saveInstanceState: Bundle?) { super<Activity>.onCreate(saveInstanceState) setContentView(R.layout.activity_main) btn = findViewById(R.id.button01) as Button printText = findViewById(R.id.textView) as TextView editText = findViewById(R.id.editText01) as EditText btn?.setOnClickListener(this) } override fun onClick(v: View) { talk.append("\r\n") talk.append(editText?.getText()) printText?.setText(talk.toString()) editText?.setText("") } override fun onCreateOptionsMenu(menu: Menu): Boolean { getMenuInflater().inflate(R.menu.menu_main, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { val id = item.getItemId() if (id == R.id.action_settings) { return true } return super<Activity>.onOptionsItemSelected(item) } }
女子力botと組み合わせたかった(失敗)
Clojureで作ってた女子力botと組み合わせたかったけど、時間切れで無理だった。
やりたかったのは、テキストを入力して、ボタンを押すと、女子力botのように女子力の高まった文章を返してくれるものを作りたかったよ!!!
(ns jyoshiryoku-bot.core (:require [clojure.contrib.str-utils :as str-utils] [clojure.java.io :as io] [jyoshiryoku-bot.kaiseki :as kaiseki]) (:gen-class :name jyoshiryoku-bot.core :methods [#^{:static true} [talkSyobochim [String] String]])) (defn searchword [userInput] (kaiseki/token-word (first (kaiseki/tokenize userInput)))) (defn talkSyobochim [userInput] (kaiseki/init "tweet.txt") (str (kaiseki/create-sentence @kaiseki/*words* (searchword userInput)))) (defn -main [talk] (talkSyobochim talk)) (defn -talkSyobochim [userInput] (talkSyobochim userInput))
Clojureをjarファイルに固めてから、main以外の関数を呼び出すやりかたと、関数から値を取得するやりかたがわからなかった(^q^)
調べてる間に時間切れたうああ。Clojureちからください。
そしてこれ、なんとか作りたいなああ!!!
やってみて
Kotlin、めっちゃ書きやすいで!!!!
めっちゃしょぼいのしか出来なかった…。
ここにひっそり置く
みんなもKotlinやろうず。