コンテンツにスキップ

Kotlin

デベロッパーガイド

Android Git pushできないとき

  • 次の設定をつける
    • または.git/config[remote "origin"]のurlを適切に書き換える
1
git remote set-url origin git@github.com:uname/reponame.git
  • ブランチがmastermainかにも注意する.

Android Studio Designが動かない: design editor is unavailable until after a successful project sync

1
2
3
cp d8 dx
cd lib
cp d8.jar dx.jar

Android Studio M1 MacでAVDを動かす

  • 参考
  • Download optionsを選択してダウンロードリストにジャンプ
  • Mac(64bit, ARM)を選ぶ

Android Studio デバイスが追加できない

  • URL
  • メニューのtools > SDK Managerに進む
  • SDK Platformsを確認し, 適切な対象をインストールする
    • 2022/11時点でWear OSを追加したときは次の対処を踏んだ
    • 右下のShow Package Detailsをチェック
    • Android 11.0配下のWear OS 3 ARM 64 v8a System Imageを選択

Android: java.lang.NullPointerException: findViewById(R.id.listView1) must not be null

  • URL
  • setContentViewの前でfindByIdを実行するとnullになってKotlinだと落ちる
  • findByIdsetContentViewのあとで実行しよう

Androidアプリのテスト

Androidアプリパッケージ名の確認

  • AndroidManifest.xmlを見てみよう

Android開発: APIリファレンス

Android開発: id紐づけの簡略化

2022-06

  • レイアウトファイルでUIを設定するだけでなく, プログラム上でUI部品に対して指示したりビューを変えられる
  • プログラム上でUI部品に指示するとき
  • レイアウトファイルとJavaで連携
    • findViewById()メソッドの呼び出しが必要: 面倒
  • kotlin
    • プラグインのKotlin Android Extensionsを使えばfindViewById()メソッドの呼び出し不要
    • Activity側でレイアウトファイルをインポートすればidが紐づけられる
      • import kotlinx.android.synthetic.main.[レイアウトファイル名].*
    • build.gradleandroid.buildFeaturesに次の項目を追加
1
2
3
4
5
6
7
8
android {
    ...
    buildFeatures {
        dataBinding = true
        viewBinding = true
    }
    ...
}
  • ソースコードは次のように書く
1
2
3
4
5
// Reference to "name" TextView using synthetic properties.
name.text = viewModel.nameString

// Reference to "name" TextView using the binding class instance.
binding.name.text = viewModel.nameString

OBSOLETE

  • Moduleレベルのbuild.gradlekotlin-android-extensionsを追加する
    • pluginsid 'kotlin-android-extensions'
  • ktファイルにはimport'kotlinx.android.synthetic.main.activity_main.*追加

Android開発: realmのインストール

  • 参考1
  • build.gradle(Project)に次を追加
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
buildscript {
    repositories {
        google()
        mavenCentral()
    }


    dependencies {
        classpath "com.android.tools.build:gradle:7.0.4"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20"

        classpath "io.realm:realm-gradle-plugin:10.4.0"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
  • build.gradle(Module)pluginsid 'kotlin-kapt', id 'realm-android'の順で追加
1
2
3
4
5
6
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'realm-android'
}
  • settings.gradlerepositoriesMode.set()の値をRepositoriesMode.PREFER_SETTINGSに変更
1
2
3
4
5
6
7
8
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) // ここを修正
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}
  • File > Project Structureを開く

Android開発: 画面遷移・intentの処理

  • 送信元でintent.putExtraする前にval intent = Intent(this, SecondActivity::class.java)で初期化する必要がある
  • intent.putExtraのあとではSecondActivityにデータが送られない
  • 実際に試してみよう
1
2
3
4
5
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("VALUE1", v1.toDouble())
intent.putExtra("VALUE2", v2.toDouble())
intent.putExtra("VALUE3", op)
startActivity(intent)

Android開発: ログを仕込む

1
2
3
4
5
6
import android.util.Log
import android.view.View

button1.setOnClickListener {
    Log.d("UI_PARTS", "ボタンをタップしました")
}

Android StudioのJDK指定

Android Studioで突然Cannot Resolve symbolで赤線が大量に出た

  • URL
  • File -> 'Invalidate Caches / Restart'を実行

SAM変換: Single Abstract Method

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
button1.setOnClickListener {
    object : View.OnClickListener {
        override fun onClick(v: View?) {
            Log.d("UI_PARTS", "ボタンをタップしました")
        }
    }
}

->

button1.setOnClickListener ( { view: View? ->
    Log.d("UI_PARTS", "ボタンをタップしました")
})

Testing in Jetpack Compose

ラムダ式の省略記法

  • 引数が1つなら省略可能: itで呼び出す
  • メソッドの最後の引数がラムダ式なら関数のbodyを (...) の外に書ける
  • 無引数ならば引数の記述を省略できる