如何在Android中处理来自Fragement的自定义方案?

oipij1gg  于 2023-03-06  发布在  Android
关注(0)|答案(2)|浏览(126)

我正在使用一个继承的Android应用程序,在某个定义为Fragment的屏幕上,我需要打开外部网页,然后等待该网页使用自定义方案重定向回我的应用程序。
我知道如何打开网页,也知道如何在Manifest中设置意图过滤器,通过启动另一个Activity来响应自定义方案。但是,启动另一个Activity不是我需要的。相反,我需要控制返回到最初启动此过程的片段。
实现这一目标的最佳方法是什么?

nhn9ugyo

nhn9ugyo1#

您必须解析Activity中的Intent,并使用片段管理器来填充所需的片段。请将Action和Fragment替换为您自己的。

@Override
protected void onNewIntent(final Intent intent) {
    super.onNewIntent(intent);
    parseIntent(intent);
}

private void parseIntent(Intent intent) {
    final String action = intent.getAction();

    if (action != null) {
        if (Action.<ONE>.equals(action)) {
            FragmentManager fm = getFragmentManager();
            Fragment<ONE> fragment = (Fragment<ONE>) Fragment.instantiate(this,
            Fragment<ONE>.class.getCanonicalName(),
            getIntent().getExtras());
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(R.id.fragment_id, fragment);
            ft.commit();
        } else if (Action.<TWO>.equals(action)) {
            FragmentManager fm = getFragmentManager();
            Fragment<TWO> fragment = (Fragment<TWO>) Fragment.instantiate(this,
            Fragment<TWO>.class.getCanonicalName(),
            getIntent().getExtras());
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(R.id.fragment_id, fragment);
            ft.commit();
        } 
    }
}
0md85ypi

0md85ypi2#

我今天才开始工作,在这上面花了一些时间。你可以通过片段很容易地做到这一点。
您需要使用的是片段内的WebView并控制shouldOverrideUrlLoading方法。
我也看到这个方法并不总是以正确的方式使用,没有人会玩它返回的webResourceRequest
因此,假设我们的片段布局中有一个web视图。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.auth.LoginFragment">

<WebView
    android:id="@+id/fragmentWebView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerHorizontal="true" />

   </FrameLayout>

现在我们已经在一个片段中定义了webview,假设您有一个想要在这里处理的自定义URI方案。
这就是你需要在你的片段中做的事情,相应地处理响应,我调用了一个函数,它基于一个响应使用fragment transaction打开其他片段。

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val loginView  = inflater.inflate(R.layout.fragment_login, container, false)
        val webView: WebView = loginView.findViewById(R.id.fragmentWebView)
        val webSetting = webView.settings
        webSetting.builtInZoomControls = true
        webSetting.javaScriptEnabled = true
        webView.loadUrl(url!!)
        webView.webViewClient = object : WebViewClient() {

            override fun shouldOverrideUrlLoading(view: WebView?, webResourceRequest: WebResourceRequest?): Boolean {
                return if(webResourceRequest?.url?.scheme.equals("myscheme")){
                    fetchAndConfigureUserIdentity(webResourceRequest?.url.toString(),loginView)
                    true
                }else{
                    false
                }
            }
        }
        return loginView
    }

希望有帮助。

相关问题