WebViewFragment webView is null after doing a FragmentTransaction

前端 未结 4 1857
故里飘歌
故里飘歌 2020-12-24 15:18

I currently have my application set up with a ListFragment on the left and a DetailsFragment on the right (similar to the layout on the tablet belo

4条回答
  •  悲&欢浪女
    2020-12-24 16:07

    With great help from Espiandev I have managed to get a working WebView. To ensure that links opened in the fragment and not in a web browser application I created a simple InnerWebView client which extends WebViewClinet.

    public class DealWebViewFragment extends Fragment {
    
        private WebView mWebView;
        private boolean mIsWebViewAvailable;
        private String mUrl = null;
    
        /**
         * Creates a new fragment which loads the supplied url as soon as it can
         * @param url the url to load once initialised
         */
        public DealWebViewFragment(String url) {
            super();
            mUrl = url;
        }
    
        /**
         * Called to instantiate the view. Creates and returns the WebView.
         */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
    
            if (mWebView != null) {
                mWebView.destroy();
            }
            mWebView = new WebView(getActivity());
            mWebView.setOnKeyListener(new OnKeyListener(){
    
    
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                      if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
                            mWebView.goBack();
                            return true;
                        }
                        return false;
                }
    
            });
            mWebView.setWebViewClient(new InnerWebViewClient()); // forces it to open in app
            mWebView.loadUrl(mUrl);
            mIsWebViewAvailable = true;
            WebSettings settings = mWebView.getSettings();
            settings.setJavaScriptEnabled(true);
            return mWebView;
        }
    
        /**
         * Convenience method for loading a url. Will fail if {@link View} is not initialised (but won't throw an {@link Exception})
         * @param url
         */
        public void loadUrl(String url) {
            if (mIsWebViewAvailable) getWebView().loadUrl(mUrl = url);
            else Log.w("ImprovedWebViewFragment", "WebView cannot be found. Check the view and fragment have been loaded.");
        }
    
        /**
         * Called when the fragment is visible to the user and actively running. Resumes the WebView.
         */
        @Override
        public void onPause() {
            super.onPause();
            mWebView.onPause();
        }
    
        /**
         * Called when the fragment is no longer resumed. Pauses the WebView.
         */
        @Override
        public void onResume() {
            mWebView.onResume();
            super.onResume();
        }
    
        /**
         * Called when the WebView has been detached from the fragment.
         * The WebView is no longer available after this time.
         */
        @Override
        public void onDestroyView() {
            mIsWebViewAvailable = false;
            super.onDestroyView();
        }
    
        /**
         * Called when the fragment is no longer in use. Destroys the internal state of the WebView.
         */
        @Override
        public void onDestroy() {
            if (mWebView != null) {
                mWebView.destroy();
                mWebView = null;
            }
            super.onDestroy();
        }
    
        /**
         * Gets the WebView.
         */
        public WebView getWebView() {
            return mIsWebViewAvailable ? mWebView : null;
        }
    
        /* To ensure links open within the application */
        private class InnerWebViewClient extends WebViewClient {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
    
    
        }
    

    Hopefully this is useful to someone in the future.

提交回复
热议问题