如何在片段中使用 webview 历史记录?

How use webview history back in a fragment?

我以为这是一个很简单的问题...但是我已经有一段时间没有解决了。 现在,按下后退按钮将关闭该应用程序。我想按后退按钮返回。 包含网络视图的片段。 HomeFragment.java

public class HomeFragment extends Fragment {
    WebView webView;

    public HomeFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        webView = view.findViewById(R.id.home_webview);
        String url = "https://galaxyhub.kr/starcitizen";
        webView.loadUrl(url);
        webView.getSettings().setJavaScriptEnabled(true);

        final ProgressDialog dialog = ProgressDialog.show(getActivity(),"", "Loading", true);
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                Toast.makeText(getActivity(), "URL ERROR", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                dialog.show();
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                dialog.dismiss();
            }

        });
    }
}

听说在MainActivity里面也要写。 如果需要,我会立即 post。

package com.example.starcitizen.fragment;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

import androidx.activity.OnBackPressedCallback;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.example.starcitizen.R;


/**
 * A simple {@link Fragment} subclass.
 */
public class HomeFragment extends Fragment {
    WebView webView;

    OnBackPressedCallback callback = new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            if (webView.canGoBack()) {
                webView.goBack();
            } else {
                //use this if you need to call the Activity
                //backpress for default back action
                requireActivity().onBackPressed();
            }
        }
    };
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        webView = view.findViewById(R.id.home_webview);
        String url = "https://galaxyhub.kr/starcitizen";
        webView.loadUrl(url);
        webView.getSettings().setJavaScriptEnabled(true);

        final ProgressDialog dialog = ProgressDialog.show(getActivity(),"", "Loading",
                true);
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                Toast.makeText(getActivity(), "URL ERROR", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                dialog.show();
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                dialog.dismiss();
            }

        });
    }
}

现在这个代码是 运行!

如果在 WebView 无法返回更多时需要从片段返回,请将片段添加到返回堆栈。

getSupportFragmentManager().beginTransaction()
  .replace(R.id.fragment_container, fragment)
  .addToBackStack(null)
  .commit();

然后在你的片段中:

public class HomeFragment extends Fragment {

    private WebView webView;

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        OnBackPressedCallback callback = new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed() {
                if (webView.canGoBack()) {
                    webView.goBack();
                } else {
                    //use this if you need to call the Activity
                    //backpress for default back action
                    requireActivity().onBackPressed();
                }
            }
        };
        requireActivity().getOnBackPressedDispatcher()
             .addCallback(getViewLifecycleOwner(), callback);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        webView = view.findViewById(R.id.home_webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebViewClient(new WebViewClient() {
            //callbacks omitted...
        });
        String url = "https://galaxyhub.kr/starcitizen";
        //call this after WebViewClient setup
        webView.loadUrl(url);
    }
}

请记住,onBackPressed 上的 Activity 将在添加到片段中的那个之前被调用。

有关后压处理的更多信息,请点击此处:https://developer.android.com/guide/navigation/navigation-custom-back#java

为此至少使用:

androidx.fragment:fragment:1.1.0