/** * {@inheritDoc} * * @deprecated use * {@link #registerForActivityResult(ActivityResultContract private val myActivityLauncher = registerForActivityResult(MyResultContract()) { result -> Log.e ("yhj", result) } result就是从上个界面传递回来的数据,,registerForActivityResult方法的返回值是ActivityResultLauncher。 private val captureLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { 非Activity/Fragment中接收数据 在Activity和Fragment中,我们能直接使用registerForActivityResult方法 ,那是因为ConponentActivity
{ super.onCreate(savedInstanceState) resultLauncher = registerForActivityResult( 而使用registerForActivityResult()可以多次调用以注册多个 ActivityResultLauncher 实例,用来处理不同的Activity结果,让代码更便于维护。 同时,引用一个官方文档的警告 ↓ 注意:虽然在 fragment 或 activity 创建完毕之前可安全地调用 registerForActivityResult(),但在 fragment 或 activity ,必须在STARTED前调用registerForActivityResult。 看来我们必须每次都必须通过registerForActivityResult预定一个ActivityResultLauncher,在需要的时候再去launch,这…似乎还是比较麻烦。
()的写法,如下所示: class FirstActivity : AppCompatActivity() { private val requestDataLauncher = registerForActivityResult 我们完全移除了对onActivityResult()方法的重写,而是调用registerForActivityResult()方法来注册一个对Activity结果的监听。 registerForActivityResult()方法接收两个参数,第一个参数是一种Contract类型,由于我们是希望从另外一个Activity中请求数据,因此这里使用了StartActivityForResult registerForActivityResult()方法的返回值是一个ActivityResultLauncher对象,这个对象当中有一个launch()方法可以用于去启用Intent。 实现代码如下: class FirstActivity : AppCompatActivity() { private val takePictureLauncher = registerForActivityResult
/** * {@inheritDoc} * * @deprecated use * {@link #registerForActivityResult(ActivityResultContract 注册协议,获取启动器-ActivityResultLauncher 注册协议,使用registerForActivityResult方法,该方法由ComponentActivity或者Fragment提供 代码如下: private val myActivityLauncher = registerForActivityResult(MyActivityResultContract()){result - result,Toast.LENGTH_SHORT).show() textView.text = "回传数据:$result" } 如上代码,注册了MyActivityResultContract,registerForActivityResult ) else toast("Permission is denied") } // 请求一组权限 private val requestMultiplePermissions = registerForActivityResult
如上图所示: 在api29中提示已过时,官方给出的替代方案是上面第二个红框的方法registerForActivityResult 该怎么用呢 ? 先看kotlin版本的写法: private val startActivity = registerForActivityResult(ActivityResultContracts.StartActivityForResult , newWordActivityRequestCode) ActivityResultLauncher<Intent> intentActivityResultLauncher = registerForActivityResult
我们完全移除了对onActivityResult()方法的重写,而是调用registerForActivityResult()方法来注册一个对Activity结果的监听。 registerForActivityResult()方法接收两个参数,第一个参数是一种Contract类型,由于我们是希望从另外一个Activity中请求数据,因此这里使用了StartActivityForResult registerForActivityResult()方法的返回值是一个ActivityResultLauncher对象,这个对象当中有一个launch()方法可以用于去启用Intent。 它将会出奇得简单: class FirstActivity : AppCompatActivity() { private val requestPermissionLauncher = registerForActivityResult 实现代码如下: class FirstActivity : AppCompatActivity() { private val takePictureLauncher = registerForActivityResult
mPhotoOpBinding: LayoutPhotoOpBinding // 请求相机权限 private val requestCameraPermission = registerForActivityResult .show() } } // 请求外部存储权限 private val requestStoragePermission = registerForActivityResult applicationContext, "拍照失败", Toast.LENGTH_SHORT).show() } } private val pickImage = registerForActivityResult Toast.makeText(applicationContext, "读取图片失败", Toast.LENGTH_SHORT).show() return@registerForActivityResult Toast.makeText(applicationContext, "读取图片失败", Toast.LENGTH_SHORT).show() return@registerForActivityResult
/** * {@inheritDoc} * * @deprecated use * {@link #registerForActivityResult(ActivityResultContract 注册协议,获取启动器-ActivityResultLauncher 注册协议,使用registerForActivityResult方法,该方法由ComponentActivity或者Fragment提供 代码如下: private val myActivityLauncher = registerForActivityResult(MyActivityResultContract()){result - result,Toast.LENGTH_SHORT).show() textView.text = "回传数据:$result" } 如上代码,注册了MyActivityResultContract,registerForActivityResult ) else toast("Permission is denied") } // 请求一组权限 private val requestMultiplePermissions = registerForActivityResult
androidx.fragment:fragment:$fragment_version” } 然后先看看最简单的使用方式,比如打开系统文件管理器选择一个图片,代码如下: val getContent = registerForActivityResult -> // 处理返回的 Uri } getContent.launch("image/*") //过滤图片 这里涉及几个重要的类和函数: (1)registerForActivityResult public final <I, O> ActivityResultLauncher registerForActivityResult( @NonNull ActivityResultContract 先看registerForActivityResult源码: @NonNull @Override public final <I, O> ActivityResultLauncher registerForActivityResult( @NonNull final ActivityResultContract<I, O> contract,
val getContent = registerForActivityResult(GetContent()) { uri: Uri? 您可以设置一个 mime 类型的过滤器对所选文件进行过滤,GetContent.launch() 接收一个字符串作为参数: val getContent = registerForActivityResult
startActivityForResult()/onActivityResult() 和 requestPermissions()/onRequestPermissionsResult() 弃用 prepareCall() 重命名为 registerForActivityResult 文章介绍的很详尽,这里不再赘述 prepareCall 重命名 值得注意的地方是 prepareCall() 被命名为 registerForActivityResult() ❝注意:在版本处于 Alpha
/** * 通过MediaStore查询文件 */ private fun queryFileByMediaStore() { queryPictureForActivityResult = registerForActivityResult * * 根据查询到的uri,获取bitmap */ private fun readFileByMediaStore() { readPictureForActivityResult = registerForActivityResult = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { TAG, "deleteFileByMediaStore: 授权失败") } } deletePictureSenderRequestActivityResult = registerForActivityResult private fun createFile(mimeType: String, fileName: String) { createFileActivityResult = registerForActivityResult
val getContent = registerForActivityResult(GetContent()) { uri: Uri? 您可以设置一个 mime 类型的过滤器对所选文件进行过滤,GetContent.launch() 接收一个字符串作为参数: val getContent = registerForActivityResult
Toast.LENGTH_SHORT).show() } ① 打开蓝牙意图 在MainActivity中新增如下代码: //打开蓝牙意图 val enableBluetooth = registerForActivityResult (if (isOpenBluetooth()) "蓝牙已打开" else "蓝牙未打开") } } 此方法就替代了之前startActivityForResult,现在我们使用registerForActivityResult ② 请求BLUETOOTH_CONNECT权限意图 registerForActivityResult不光能用于页面获取值,也能用于请求权限。 //请求BLUETOOTH_CONNECT权限意图 val requestBluetoothConnect = registerForActivityResult(ActivityResultContracts.RequestPermission ,首先我们需要在MainActivity中创建扫描意图: //请求BLUETOOTH_SCAN权限意图 private val requestBluetoothScan = registerForActivityResult
object-declarations.html 从子activity获取返回结果 GeoQuiz应用内部的交互时序图 这里 startActivityForResult 已经被弃用了,当前 google 推荐registerForActivityResult MainActivity.kt 中: class MainActivity : AppCompatActivity() { ··· private val startForResult = registerForActivityResult
enableBluetooth; //打开蓝牙意图 private void registerIntent() { //打开蓝牙意图 enableBluetooth = registerForActivityResult ); } }); } 这里声明了一个变量,然后在方法中对变量进行赋值,此方法就替代了之前的startActivityForResult,现在我们使用registerForActivityResult 在返回中可以得知当前是否打开了蓝牙,因为是在Java中使用,因此我们写了一个registerIntent()方法,我们需要在onCreate之前调用这个方法,如图所示: ② 请求BLUETOOTH_CONNECT权限意图 registerForActivityResult 请求蓝牙连接权限意图 然后在registerIntent()方法中,增加如下代码: //请求BLUETOOTH_CONNECT权限意图 requestBluetoothConnect = registerForActivityResult 请求蓝牙扫描权限意图 然后在registerIntent()方法中进行赋值,代码如下所示: //请求BLUETOOTH_SCAN权限意图 requestBluetoothScan = registerForActivityResult
R.id.btn_second5) { activityResultLancher.launch(new Intent(this, SecondActivity.class)); } 2:registerForActivityResult startActivityForResult + onActivityResult 机制的平替 private ActivityResultLauncher<Intent> activityResultLancher = registerForActivityResult
视频挑选与封面加载代码示例如下: // 注册一个善后工作的活动结果启动器,获取指定类型的内容 ActivityResultLauncher launcher = registerForActivityResult
private void register() { intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult takePictureActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.TakePicture openAlbumActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.OpenDocument( permissionActivityResultLauncher; 然后在register方法中增加如下代码: //多个权限返回结果 permissionActivityResultLauncher = registerForActivityResult
LoginProxyFragment } } private var block: (result: LoginResult) -> Unit = { } private val launcher = registerForActivityResult