質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

792閲覧

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

rasum

総合スコア21

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2022/07/23 08:36

前提

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 } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/07/23 08:47

> registerForActivityResult(){}内でTextViewへのパス代入まで行うと正常に動作します。 それが正解かと。 > registerForActivityResult()で取得した値をregisterForActivityResult()の外で画面表示することは可能でしょうか? 「registerForActivityResult()の外」とは? (単にメソッドを呼べば良いだけでは?)
rasum

2022/07/23 09:47

「単にメソッドを呼べば良いだけでは?」とは具体的にどのように書けばよいでしょうか? 質問のとおりですが、下記のコードではうまくできていません。 selectDir() binding.textView01.text = selectedPath
guest

回答1

0

ベストアンサー

selectDir を呼び出して戻ってきた段階ではファイルピッカーが表示されたりしている状態です。
ですので selectDir の直後に selectedPath を見ても何も変化していません。
(「1つ前に選択したディレクトリパスが表示される」のはココで設定しているからです。)
ユーザがファイルピッカーを操作して選択すると、 result -> のメソッドが実行されて selectedPath に値が入ることになります。
selectedPath の最新の値を用いるのであれば、このタイミングで行うのが一番です。

registerForActivityResult()で取得した値をregisterForActivityResult()の外で

「外で」というのはどのようなイメージなのでしょうか。
単に埋め込まれたくないというだけであれば、 hoshi-takanori さんご指摘のように
fun setText(path: String) {
binding.textView01.text = path
}
とメソッドを作ってそれを registerForActivityResult() から呼ぶだけでしょう。

投稿2022/07/23 11:16

編集2022/07/23 11:24
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rasum

2022/07/23 12:30

jimbe様、ありがとうございます。よくわかりました。 ちなみに、値の画面表示をonResume() に記述すると、きちんと表示されました。 override fun onResume() { super.onResume() binding.textView01.text = selectedPath }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問