android開発 registerForActivityResult()で得た値の画面表示タイミングについて

前提

androidでファイル・ピッカーを開き、選択したディレクトリのパスをTextViewに表示しようとしています。
ボタンクリックでregisterForActivityResult().launchを呼び出し、
registerForActivityResult(){}内でディレクトリパスを取得し、
launch呼び出しの直後で取得したパスをTextViewに入れている場合、
選択したディレクトリパスがすぐにはTextViewに表示されません。(次のボタンクリックで別のディレクトリを選択した時に、1つ前に選択したディレクトリパスが表示される)

registerForActivityResult(){}内でTextViewへのパス代入まで行うと正常に動作します。

実現したいこと

registerForActivityResult()で取得した値をregisterForActivityResult()の外で画面表示することは可能でしょうか?

該当のソースコード

kotlin

class MainActivity : AppCompatActivity() { var selectedPath: String = "" private val binding: ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) } private val startDirSelect = registerForActivityResult( ActivityResultContracts.StartActivityForResult()){ result -> if (result.resultCode == AppCompatActivity.RESULT_OK) { selectedPath = result.data?.data.toString() } else { selectedPath = "_-error-_" } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) binding.buttonStart.setOnClickListener{ selectDir() binding.textView01.text = selectedPath //selectDir()の結果が即座には表示されない } } @RequiresApi(Build.VERSION_CODES.O) fun selectDir() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { addFlags( Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION or Intent.FLAG_GRANT_PREFIX_URI_PERMISSION ) } startDirSelect.launch(intent) }}

補足情報(FW/ツールのバージョンなど)

コンパイル環境  build.gradle(:app)

plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { compileSdk 32 defaultConfig { minSdk 24 targetSdk 32 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding true } }

コメントを投稿

0 コメント