webview go назад без закрытия приложения (kotlin) - PullRequest
1 голос
/ 20 апреля 2020

M приложение отобразит WebView, но когда я go войду в другие части веб-сайта (например, cat.html), а затем коснусь назад, оно закроет приложение, вместо того чтобы вернуться на index.html (домашняя страница)

Итак, я хочу знать, как это будет работать, например, как go вернуться к 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
    }

}

1 Ответ

1 голос
/ 20 апреля 2020

TL; DR

Вы должны обрабатывать этот случай внутри onBackPressed() метода непосредственно в вашей деятельности (не во фрагменте).

Вы обрабатываете эту ситуацию многими способами, например, с помощью :

  • прямое использование объекта Fragment

  • Реализация некоторого дополнительного интерфейса для этого

  • ViewModel

Если вы будете использовать 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()).

Но если у вас есть WebView внутри фрагмента, вы должны:

1) Создать новые методы в вашем Фрагмент, который

  • возвращает информацию «может go вернуться в WebView» или нет.

  • "скажем" WebView, который должен go назад

Я немного исправил ваш Android поток (используя onCreateView) и использовал Kotlin Расширение для установки свойств в 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) Используйте новый метод внутри 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()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...