打开外部 URL 时“不推荐使用 Fragment 中的 startActivityForResult(Intent,int)”的 Java 解决方案?

ban*_*ing 4 java android android-fragments

我的应用程序包含一个简单的片段,用于打开外部网页,具有:

Intent intent = new Intent(Intent.ACTION_VIEW, externalUrl); // Uri
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent chooserIntent = Intent.createChooser(intent, "Open URL...");
startActivityForResult(chooserIntent, RC_OPEN_URL);
Run Code Online (Sandbox Code Playgroud)

并且,当返回结果时(在我的 Fragment's 中onActivityResult(...)),Fragment 从 backstack 中弹出。

但是,我现在收到了新的弃用警告:

Fragment 中的 startActivityForResult(Intent,int) 已被弃用

我已经阅读了相应的从活动文档中获取结果,但我不确定如何调整他们为我的特定情况提供的示例。

我发现了ActivityResultContracts.StartActivityForResult类,但不知道如何将我的传递chooserIntent给它。

该课程的所有在线示例似乎都在 Kotlin 中,而我尝试将它们反编译为 Java 并没有任何乐趣。因此,非常感谢如何使用新的registerForActivityResult()方法打开外部 URL的 Java 示例。

ian*_*ake 11

根本没有理由使用startActivityForResult()for createChooser()- 您可以在调用后立即使用startActivity和运行您的代码:onActivityResult()startActivity

Intent intent = new Intent(Intent.ACTION_VIEW, externalUrl); // Uri
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent chooserIntent = Intent.createChooser(intent, "Open URL...");
startActivity(chooserIntent);
// Do your code from onActivityResult() here
Run Code Online (Sandbox Code Playgroud)

但是,如果你真的想使用Activity Result API,那么你可以直接改编文档中的示例,将示例GetContent合约替换为StartActivityForResult合约:

// Create this as a variable in your Fragment class
ActivityResultLauncher<Intent> mLauncher = registerForActivityResult(
    new StartActivityForResult(),
    new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            // Do your code from onActivityResult
        }
});

private void triggerChooser(Uri externalUri) {
    Intent intent = new Intent(Intent.ACTION_VIEW, externalUrl); // Uri
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Intent chooserIntent = Intent.createChooser(intent, "Open URL...");
    mLauncher.launch(chooserIntent);
}
Run Code Online (Sandbox Code Playgroud)