我正在使用一个继承的Android应用程序,在某个定义为Fragment的屏幕上,我需要打开外部网页,然后等待该网页使用自定义方案重定向回我的应用程序。我知道如何打开网页,也知道如何在Manifest中设置意图过滤器,通过启动另一个Activity来响应自定义方案。但是,启动另一个Activity不是我需要的。相反,我需要控制返回到最初启动此过程的片段。实现这一目标的最佳方法是什么?
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(); } } }
0md85ypi2#
我今天才开始工作,在这上面花了一些时间。你可以通过片段很容易地做到这一点。您需要使用的是片段内的WebView并控制shouldOverrideUrlLoading方法。我也看到这个方法并不总是以正确的方式使用,没有人会玩它返回的webResourceRequest。因此,假设我们的片段布局中有一个web视图。
shouldOverrideUrlLoading
webResourceRequest
<?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打开其他片段。
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 }
希望有帮助。
2条答案
按热度按时间nhn9ugyo1#
您必须解析Activity中的Intent,并使用片段管理器来填充所需的片段。请将Action和Fragment替换为您自己的。
0md85ypi2#
我今天才开始工作,在这上面花了一些时间。你可以通过片段很容易地做到这一点。
您需要使用的是片段内的WebView并控制
shouldOverrideUrlLoading
方法。我也看到这个方法并不总是以正确的方式使用,没有人会玩它返回的
webResourceRequest
。因此,假设我们的片段布局中有一个web视图。
现在我们已经在一个片段中定义了webview,假设您有一个想要在这里处理的自定义URI方案。
这就是你需要在你的片段中做的事情,相应地处理响应,我调用了一个函数,它基于一个响应使用
fragment transaction
打开其他片段。希望有帮助。