##はじめに
新規アプリケーションで空のアクティビティを選択して準備が終わっていることが前提です。
Shift + F10を押すとコンパイルが開始されて仮想Androidが起動してアプリの実行が行われます。
正常に起動するとHello Worldと表示されます。
##Hello World!と表示されたのはなぜ?
空のアクティビティを実行すると画面中央に「Hello World!」と定番の表示が行われました。
これはエディタ画面の上側にあるactivity_main.xmlタブを開いて表示される中身に秘密があります。
ホームページを作るときのHTMLのようにタグが並んでいて TextViewの表示の何行か下に「android:text="Hello World!"」という行があります。
つまりこれが表示されているわけです。
この部分を変更して実行すると画面に反映されるのがわかります。
##基礎演算の理解と練習
エディタの上にあるタグ「activity_main.xml」をクリックします。
この部分はこれまで開発環境で開いたファイルが表示されていますが、間違って閉じた場合は画面左側のプロジェクト構成を表示しているツリーから
app/java/[プロジェクト名]にあるMainActivity.ktを開きましょう。
レイアウトファイルのactivity_main.xmlのタブを閉じてしまった場合はapp/res/layout/にあるactivity_main.xmlを開きます。
activity_main.xmlを開くと表示されるXMLに1行「android:id="@+id/tvMain"」を追加して下記のようにしあます。
入力するのが大変に感じますが、実際は空行で「id」と入力されると補完されるのでEnterで確定、その後自動的に「@+id/」が候補に出るのでEnterを押した後 tvMain と入力するだけです。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
次はMainActivity.ktの方を開きます。
MainActivity.ktを開くとすでに
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
このようなプログラムが記述されています。
折角なのでこれを使ってAndroidやKotlinの動きを確認してみましょう。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tvMain = findViewById<TextView>(R.id.tvMain)
tvMain.setText("Hello Kotlin World!")
}
}
2行追加しました。これで実行すると Hello Kotlin World に変わったはずです。
###表示が変わった理由
表示が変わったのはアプリが実行されると共に追加した2行が処理されたのが原因です。
Windowsアプリなら Formの Create やShowイベント。
マイコンのプログラムなら setupやmainに該当するのが
override fun onCreate(savedInstanceState: Bundle?) {
になります。
###ちょっと難しいけど説明
class MainActivity : AppCompatActivity() {
AppCompatActivity とクラスが他で定義されていてそれをMainActivityという名前で使います。
override fun onCreate(savedInstanceState: Bundle?) {
AppCompatActivityには抽象クラスと呼ばれる onCreateメソッド(イベントのほうがわかりやすい)が定義されているので、AppCompatActivityを使った場合は onCreateを実装します。
super.onCreate(savedInstanceState)
onCreate はクラスが生成されるときに発生するイベントですが、その他の処理は定義元のクラスにあるので、この1行を書いてそっちで初期化処理を済ませます。
他言語だとinherited とかですね。
setContentView(R.layout.activity_main)
表示レイアウト R.layout.activity_main に従って画面を表示します。
R.layout.activity_main ってのはエディタ左側の app/res の resが Rになったと思えばわかりやすいです。
###追加した2行
追加した2行
val tvMain = findViewById(R.id.tvMain)
定数 tvMain を定義します。
定義後に初期化し、その初期値は
findViewById で該当するレイアウト上のパーツを探します。
そのパーツは「TextView」型なのであらかじめこの型が返ってくることを期待します。
R.id.tvMainにてtvMainという IDが付いたパーツ※先ほどXMLに追加したものを参照します。
tvMain.setText("Hello Kotlin World!")
代入したtvMainはTextViewクラスなのでTextというプロパティを持ちます。
そのプロパティへ代入用のメソッド(関数)setTextを使用して値を代入します。
アプリ起動時に生成されるクラスの生成イベントに割り込んで、元々の処理は上位クラスに任せた後、レイアウト上にある指定したID tvMainを持つパーツを検索して、そのパーツのテキストに指定したものを代入するといった処理が行われているのです。
この初期化処理に便乗して Kotlinの変数や基礎演算を覚えてしまいましょう。