Kotlin (Android) のスニペット集

このページは、Kotlin (Android) のスニペットをまとめる予定のページです。

目次

注意

  • コードのライセンスは CC0 (クレジット表示不要、改変可、商用可) です。
  • Kotlin 1.3.72, Android API レベル 29 時点のコードです。将来のバージョンでは動作しない可能性があります。

スニペット

日付のフォーマット

val formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")
val dateTime = LocalDateTime.now()
val dateTimeString = dateTime.format(formatter)

部品の背景のセット

Fragment (onCreateView()) 上でのボタン背景のセット
//val root = inflater.inflate(R.layout.fragment_home, container, false)
val buttonExample = root.findViewById(R.id.button_example)
buttonExample.background = ContextCompat.getDrawable(requireContext(), R.drawable.bg_button_example)

部品の有効・無効切り替え

有効
buttonExample.isEnabled = true
無効
buttonExample.isEnabled = false

権限の確認 (ランタイム)

Fragment 上での権限の確認の例
/** 権限コード */
private val PERMISSION_GRANTED = 1;
/** 確認したい権限 (例) */
private val PERMISSIONS = arrayOf(
    Manifest.permission.RECORD_AUDIO,
    Manifest.permission.READ_EXTERNAL_STORAGE
)

/**
 * ユーザーが権限許可・拒否を選択した時
 */
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    when (requestCode) {
        PERMISSION_GRANTED -> {
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                // 許可 (あらためて権限が必要なメソッドなどを実行)
                // execute()
            } else {
                // 拒否
            }
            return
        }
        else -> {
            // 不明なコード
        }
    }
}

/**
 * 必要な権限があるか確認します。
 */
fun hasPermissions(context: Context, vararg permissions: String): Boolean = permissions.all {
    ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
}

/**
 * 権限が必要な処理の例です。(権限の確認のテスト)
 */
fun execute() {
    // 権限がない場合はリクエスト
    if (!hasPermissions(requireContext(), *PERMISSIONS)) {
        requestPermissions(PERMISSIONS, PERMISSIONS_GRANTED)
        return
    }
    // 権限許可後の処理...
}

ViewModel の使用

ViewModel の定義の例 (変更可能なデータ)
class ExampleViewModel : ViewModel() {
    private val _text = MutableLiveData<String>()
    val text: MutableLiveData<String> = _text
}
Fragment 内での使用の例
// ViewModel の生成
exampleViewModel = ViewModelProvider(this).get(ExampleViewModel::class.java)
// 反映先 UI
val textView: TextView = root.findViewById(R.id.text_view_1)
// 反映後の処理
exampleViewModel.text.observe(viewLifecycleOwner, Observer {
    textView.text = it
})
// 値のセット
exampleViewModel.text.value = "test"

AsyncTask の使用

タスクの定義
class ExampleAsyncTask : AsyncTask<Void, Void, Void>() {
    /**
     * 前処理
     */
    override fun onPreExecute() {
    }
    /**
     * 実行処理
     */
    override fun doInBackground(vararg param: Void?): Void? {
        return null
    }
    /**
     * 進捗処理
     */
    override fun onProgressUpdate(vararg values: Void?) {
    }
    /**
     * 後処理
     */
    override fun onPostExecute(result: Void?) {
    }
}
タスクの実行
ExampleAsyncTask().execute()

録音

MediaRecorder

録音再生
val soundFilePath = "録音先のパス"
// val soundFilePath = context?.getExternalFilesDir(null).toString() + "/test.wav"

try {
    mediaRecorder = MediaRecorder()
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC)
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT)
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT)
    mediaRecorder.setOutputFile(soundFilePath)
    mediaRecorder.prepare()
    mediaRecorder.start()
} catch (e: Exception) {
    e.printStackTrace()
}
録音終了
try {
    mediaRecorder?.stop()
    mediaRecorder?.reset()
} catch (e: Exception) {
    e.printStackTrace()
}
権限
<uses-permission android:name="android.permission.RECORD_AUDIO" />

音声ファイルの再生

val soundFilePath = "録音先のパス"
try {
    val player = MediaPlayer()
    player.setDataSource(soundFilePath)
    player.prepare()
    player.start()
} catch (e: Exception) {
    e.printStackTrace()
}