webview 在不关闭应用程序的情况下返回(kotlin)
webview go back without closing the app(kotlin)
M 应用程序将显示 WebView
但是当我进入网站的其他部分(如 cat.html
)然后点击返回时,它会关闭应用程序而不是返回到 index.html
(主页)
所以我想知道这将如何工作,比如如何在不关闭应用程序的情况下返回 index.html
。
我的代码:
class HomeFragment : Fragment() {
private lateinit var homeViewModel: HomeViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val v = inflater.inflate(R.layout.fragment_home, container, false)
val webview = v.findViewById<View>(R.id.webview) as WebView
webview.settings.javaScriptEnabled = true
webview.settings.setAppCacheEnabled(true)
webview.webViewClient = WebViewClient()
webview.loadUrl("file:///android_asset/newsfeed/index.html")
return v
}
}
TL;DR
您必须直接在 Activity 中的 onBackPressed()
方法中处理这种情况(而不是在 Fragment 中)。
您可以通过多种方式处理这种情况,例如通过:
直接使用Fragment对象
为此
实现一些额外的接口
ViewModel
如果您将直接在 Activity
中使用您的 WebView
你可以使用像这样简单的东西:
override fun onBackPressed() {
if (webView.canGoBack()) {
// If possible - go back in WebView
webView.goBack()
} else {
// If NOT possible - just handle going back as always
super.onBackPressed()
}
}
其中 webView
是您在 XML 布局文件中的视图(在 onCreate()
方法中膨胀)。
但是当你在 Fragment 中有 WebView
时,你必须:
1) 在片段中创建新方法,
return信息"can go back in WebView"与否。
"say" 应该返回的 WebView
我稍微修复了你的 Android 流程(使用 onCreateView
)并使用 Kotlin Extension 在 WebView
中设置属性
class HomeFragment : Fragment() {
/**
* New method, allowing as to check "can we go back in WebView or not"
*/
fun webViewCanGoBack() = webview.canGoBack()
/**
* New method, saying WebView that should go back
*/
fun webViewGoBack() = webview.goBack()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_home, container, false)
@SuppressLint("SetJavaScriptEnabled")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
webview.run {
settings.run {
javaScriptEnabled = true
setAppCacheEnabled(true)
}
webViewClient = WebViewClient()
loadUrl("http://www.google.com")
}
}
}
2) 在 activity.
的 onBackPressed()
方法中使用新方法
记住,你是在这个片段的现有实例上调用这个方法,所以你必须把它存储在某个地方:
override fun onBackPressed() {
if (homeFragment.webViewCanGoBack()) {
// If possible - go back in WebView
homeFragment.webViewGoBack()
} else {
// If NOT possible - just handle going back as always
super.onBackPressed()
}
}
M 应用程序将显示 WebView
但是当我进入网站的其他部分(如 cat.html
)然后点击返回时,它会关闭应用程序而不是返回到 index.html
(主页)
所以我想知道这将如何工作,比如如何在不关闭应用程序的情况下返回 index.html
。
我的代码:
class HomeFragment : Fragment() {
private lateinit var homeViewModel: HomeViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val v = inflater.inflate(R.layout.fragment_home, container, false)
val webview = v.findViewById<View>(R.id.webview) as WebView
webview.settings.javaScriptEnabled = true
webview.settings.setAppCacheEnabled(true)
webview.webViewClient = WebViewClient()
webview.loadUrl("file:///android_asset/newsfeed/index.html")
return v
}
}
TL;DR
您必须直接在 Activity 中的 onBackPressed()
方法中处理这种情况(而不是在 Fragment 中)。
您可以通过多种方式处理这种情况,例如通过:
直接使用Fragment对象
为此
实现一些额外的接口
ViewModel
如果您将直接在 Activity
中使用您的WebView
你可以使用像这样简单的东西:
override fun onBackPressed() {
if (webView.canGoBack()) {
// If possible - go back in WebView
webView.goBack()
} else {
// If NOT possible - just handle going back as always
super.onBackPressed()
}
}
其中 webView
是您在 XML 布局文件中的视图(在 onCreate()
方法中膨胀)。
但是当你在 Fragment 中有 WebView
时,你必须:
1) 在片段中创建新方法,
return信息"can go back in WebView"与否。
"say" 应该返回的 WebView
我稍微修复了你的 Android 流程(使用 onCreateView
)并使用 Kotlin Extension 在 WebView
class HomeFragment : Fragment() {
/**
* New method, allowing as to check "can we go back in WebView or not"
*/
fun webViewCanGoBack() = webview.canGoBack()
/**
* New method, saying WebView that should go back
*/
fun webViewGoBack() = webview.goBack()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_home, container, false)
@SuppressLint("SetJavaScriptEnabled")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
webview.run {
settings.run {
javaScriptEnabled = true
setAppCacheEnabled(true)
}
webViewClient = WebViewClient()
loadUrl("http://www.google.com")
}
}
}
2) 在 activity.
的onBackPressed()
方法中使用新方法
记住,你是在这个片段的现有实例上调用这个方法,所以你必须把它存储在某个地方:
override fun onBackPressed() {
if (homeFragment.webViewCanGoBack()) {
// If possible - go back in WebView
homeFragment.webViewGoBack()
} else {
// If NOT possible - just handle going back as always
super.onBackPressed()
}
}