前提
androidでファイル・ピッカーを開き、選択したディレクトリのパスをTextViewに表示しようとしています。
ボタンクリックでregisterForActivityResult().launchを呼び出し、
registerForActivityResult(){}内でディレクトリパスを取得し、
launch呼び出しの直後で取得したパスをTextViewに入れている場合、
選択したディレクトリパスがすぐにはTextViewに表示されません。(次のボタンクリックで別のディレクトリを選択した時に、1つ前に選択したディレクトリパスが表示される)
registerForActivityResult(){}内でTextViewへのパス代入まで行うと正常に動作します。
実現したいこと
registerForActivityResult()で取得した値をregisterForActivityResult()の外で画面表示することは可能でしょうか?
該当のソースコード
kotlin
1class MainActivity : AppCompatActivity() { 2 var selectedPath: String = "" 3 private val binding: ActivityMainBinding by lazy { 4 ActivityMainBinding.inflate(layoutInflater) 5 } 6 7 private val startDirSelect = registerForActivityResult( 8 ActivityResultContracts.StartActivityForResult()){ 9 result -> 10 if (result.resultCode == AppCompatActivity.RESULT_OK) { 11 selectedPath = result.data?.data.toString() 12 } else { 13 selectedPath = "_-error-_" 14 } 15 } 16 17 override fun onCreate(savedInstanceState: Bundle?) { 18 super.onCreate(savedInstanceState) 19 setContentView(binding.root) 20 21 binding.buttonStart.setOnClickListener{ 22 selectDir() 23 binding.textView01.text = selectedPath //selectDir()の結果が即座には表示されない 24 } 25 } 26 27 @RequiresApi(Build.VERSION_CODES.O) 28 fun selectDir() { 29 val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { 30 addFlags( 31 Intent.FLAG_GRANT_READ_URI_PERMISSION or 32 Intent.FLAG_GRANT_WRITE_URI_PERMISSION or 33 Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION or 34 Intent.FLAG_GRANT_PREFIX_URI_PERMISSION ) 35 } 36 startDirSelect.launch(intent) 37 } 38}
補足情報(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 } }
回答1件
あなたの回答
tips
プレビュー