アプリのイメージ
端末に保存されている画像を選択したい。
関連: 【Android,Kotlin】OpenDocumentで端末内の画像ファイルを選択して表示する
実装
レイアウト
ImageView
とボタンを設置しておく。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="300dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/next"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/imageView"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Fragment/ViewModel
フィールドにregisterForActivityResult
でActivityResultContracts.GetContent()
のlauncherを作る。
private val viewModel: FirstViewModel by viewModels()
private val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
val context = context ?: return@registerForActivityResult
val uri = uri ?: return@registerForActivityResult
viewModel.loadImage(uri, requireContext())
}
ViewModel
は以下の通り。
Bitmapイメージを保持するLiveData image
を用意しておいて、content://...
形式のURIからBitmapを作って
image
にセットするメソッドloadImage
を用意しておく。
val image = MutableLiveData<Bitmap>()
fun loadImage(uri: Uri, context: Context) {
viewModelScope.launch {
image.value = ImageDecoder.decodeBitmap(
ImageDecoder.createSource(context.contentResolver, uri)
)
}
}
Fragmentに戻ってonCreateView
でViewModel
のimage
を監視して変更があったらレイアウトのImageView
にセット。
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
...
viewModel.image.observe(viewLifecycleOwner) {
binding.imageView.setImageBitmap(it)
}
...
}
onViewCreated
でボタンクリック時にGetContent
のlauncherを呼び出す。
選択できるファイルのContent Typeを画像に絞っておく。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.button.setOnClickListener {
getContent.launch("image/*")
}
}
\確かな知識を身に着けたい、Androidアプリ開発を学びたい人にオススメ!/