初めての kotlin 何からやればいい?
こうした悩みを解決します。
トーストとは
トーストは、アプリ画面上に表示するポップアップのことです。
ユーザーが行なった操作に関する簡単なフィードバックとして使うことが多いです。
公式サイトはこちらを参照。
使い方
トーストを使うにはトースト Widget をインポート(1行目)して、トーストの関数を記述(8行目)します。
import android.widget.Toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Toast.makeText(applicationContext, "toast example", Toast.LENGTH_LONG).show()
}
}
3つの引数をとるmaketextメソッドを使うことで表示できます。
1つ目の引数:context
contextとは、抽象クラスであり、ActivityContextやApplicationContextのスーパークラスになります。
ActivityContextやApplicationContextの元になるのがContextということですね。
Activity / Application
ApplicationContextは基本的にアプリが死ぬまでnullにはなりませんが、ActivityContextはActivityがライフサイクルで死んだ後はnullになります。
だからと言って、常にApplicationContextの方を参照してしまうと意図しないテーマがView(標準ダイアログなど)に割り当てられたり、メモリリークの原因となります。
そのため、ライフサイクルに逆らわず、ActivityContextを使った方が無難です。
スーパークラス(基底クラス)
スーパークラスとは、あるクラスの仕様を継承して新しいクラスを作成する際に、元となるクラスのことです。
今回の話でいえば、ActivityやApplicationはcontextから見るとサブクラスということになります。
サブクラス(派生クラス)
サブクラスはスーパークラスのプロパティやメソッドを引き継ぎ、スーパークラスに無い独自の部分だけを新たに定義・実装して作ったものです。
スーパークラスがopenしていないと継承できないので注意!
//スーパークラス。openを付けないと継承できない
open class Nagano{
~~
}
//Naganoを継承したTateshinaクラス。「:」でスーパークラスを指定する
class Tateshina: Nagano(){
~~
}
オーバーライド
オーバーライドとは、スーパークラスで定義されたメソッドを、そのクラスを継承したサブクラスで独自に定義しなおして上書きすることです。
「override」キーワードで、オーバーライドすることを明示的に宣言が必要
//基底クラス
open class Person(val name: String, val phone: String = ""){
//「open」キーワードでオーバーライド可能に
open fun print(){
println("名前,電話番号: ${name}, ${phone}")
}
}
//継承クラス
class Person2(name: String, phone: String = "", val sex: Int) : Person(name, phone){
//メソッドのオーバーライド(性別を追加)
override fun print(){
println("お名前: ${firstName} ${lastName}, 年齢: $age")
}
}
抽象クラス
抽象クラスとは、抽象メソッドを1つ以上持つクラスです。実体(インスタンス)を持たないです。
メンバのオーバーライドをサブクラスに強制する仕組みです。
メソッドやプロパティにabstructをつけることで抽象メンバとなります。
abstructがついている抽象メンバはオーバーライド必須なのでopenキーワードは不要です。
複数人で開発するときに抽象クラスを共有することで、実装ルールを作れるのが利点。
//抽象メソッドを1つだけ持つ抽象クラス
abstract class Shop(val name: String){
//抽象プロパティ
abstract var employee: Int
//抽象メソッド
abstract fun sell(item: String): String
}
//インスタンス生成
class Tatepro(name: String): Shop(name){
override var employee = 0
override fun sell(item: String): String = "${item}を売ります"
}
インスタンス
インスタンスはクラスの実体です。
上で抽象クラスを書きましたが、抽象クラス自体は実体を持てません。
抽象クラスを継承したサブクラスを実体化させる必要があります。