オレ、童貞捨てたよ。(AndroidとKotlinはじめてみた。)

(このエントリーはKotlin Advent Calendar 2014 - Adventarの21日目の記事です!)

24歳、このままKotlinをやらずに20代後半に足を踏み入れていいのか自問し、
ついにKotlin童貞を捨てる事にしました。
あと、ついでにAndroid童貞も捨てます。

しょぼちむ Advent Calendar 2014 - Adventarの12日目、[twitter:@grimrose]さんの
open build/reports/life/index.html: しょぼちむさんがKotlinをやらない理由を考えてみたの記事に、こう↓かいてあったので、とりあえずGitHub - JetBrains/kotlin: The Kotlin Programming Languageにスターつけるとこから始めた。

f:id:syobochim:20141221010447p:plain

f:id:syobochim:20141221010540g:plain

よし。いい滑り出しです。


宿題はぎりぎりまでやらないタイプなので、21日から始めてみる(震え)

Android Studioをダウンロードする

Download Android Studio and SDK tools  |  Android DevelopersからAndroidStudioをダウンロードしてインストールした。

f:id:syobochim:20141221114650p:plain
うおおお

とりあえず出てくる質問にはいはいと答えていく。
ダウンロードはじまた。
f:id:syobochim:20141221114817p:plain
めっちゃ時間かかる(^q^)

プロジェクトを作成する

PJを新規作成する。
f:id:syobochim:20141221120226p:plain

適当に答えてみる。
f:id:syobochim:20141221120512p:plain

f:id:syobochim:20141221120601p:plain

f:id:syobochim:20141221120609p:plain

f:id:syobochim:20141221120655p:plain

なんかできた!!!

動かしてみる

エミュレーターを動かしてみるとエラー出た

/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が足りていないエラーのようなので、ダウンロードしてみる。
f:id:syobochim:20141221121120p:plain
f:id:syobochim:20141221121405p:plain

ダウンロード、めっちゃかかる(・−・)

ダウンロード完了して再度実行!!

/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!
f:id:syobochim:20141221154224p:plain
うおおおおお!!!
f:id:syobochim:20141221160235p:plain

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をインストールする。
f:id:syobochim:20141221123032p:plain

f:id:syobochim:20141221123128p:plain

よしよし。
再起動すると、こういうのでてきた。
f:id:syobochim:20141221133431p:plain
従ってみたら、build.gradleが変わった!!!うおおお!!
src/mainフォルダの下にkotlinディレクトリを作ると、srcパスがすでに通っている!!
Kotlinファイルをそこに移動させる。
とりあえずデフォルトのMainActivityと同じことをさせてみたいので、
https://sites.google.com/site/tarokotlin/chap8/sec82を見ながら見よう見真似で書いてみる。

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ファイルを削除して実行してみる。
f:id:syobochim:20141221165258p:plain

なんかうまくいったっぽい!!?
(文法しらない割に、さらっと書けてしまうのイイ!!!)

そして、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)
    }

f:id:syobochim:20141221172303p:plain

やったぜー!!!

ボタンをつけてみる

ボタンをつけてみる。
素人のアンドロイドアプリ開発日記アンドロイドアプリでクリックイベントを取得 - 素人のアンドロイドアプリ開発日記
ふむふむ。

activity_main.xmlにボタンを追加すればええんやな。。。

?!!?!!!!

f:id:syobochim:20141221174204p:plain

あ、、れ????なんかエラーでて画面が表示されない…。
ぐぐったけどわからない助けて…。
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("おしたぜーーーー!!!!")
        }
    }

f:id:syobochim:20141221183622p:plain
f:id:syobochim:20141221183634p:plain

うん。なんかうしろに文字列みえてるけどだいじょうぶ。まだあわてる時間じゃない。

ボタンを押した時の動作を追加した

activity_main.xmlでレイアウトを作れないことが悲しい+時間がないので、別プロジェクトを新規作成して、レイアウトを作って、xmlのなかみだけもらうことにした。

f:id:syobochim:20141221193246p:plain

これはいける気がしてきた…!!!
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)
    }
}

f:id:syobochim:20141221193402p:plain

女子力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やろうず。

ちなみにシール貼ったで!!!

f:id:syobochim:20141222001625p:plain