如何在Fragment中的WebView中添加"Go Back"功能?

Mar*_*bey 32 android android-webview android-fragments

更新:解决了!问题与我的Viewpager而不是WebView有关.

我正在尝试向我WebView的内部添加一个"返回"功能Fragment.但我无法弄清楚如何:

public final class TestFragment extends Fragment {

    static WebView mWeb;
    private View mContentView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {   
        mContentView = inflater.inflate(R.layout.webview, null);
        mWeb = (WebView)mContentView.findViewById(R.id.webview);

        WebSettings settings = mWeb.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setSupportZoom(false);
        mWeb.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        mWeb.getSettings().setBuiltInZoomControls(false);
        mWeb.loadUrl("myurl...");
        mWeb.setOnKeyListener(new OnKeyListener(){
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if ((keyCode == KeyEvent.KEYCODE_BACK) && mWeb.canGoBack()) {
                    mWeb.goBack();
                    return true;
                }
                return false;
            }
        });
    }   
}
Run Code Online (Sandbox Code Playgroud)

我也试过类似的东西:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWeb.canGoBack()) {
        mWeb.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)

另一种解决方案但同样的问

@Override
public void onBackPressed()
{
    if(webView.canGoBack())
        webView.goBack();
    else
        super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何让这个工作?

Rom*_*ack 47

也许它的机器人限制.尝试使用处理程序执行此操作.

public final class TestFragment extends Fragment {


    static WebView mWeb;
    private View mContentView;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message message) {
            switch (message.what) {
                case 1:{
                    webViewGoBack();
                }break;
            }
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {   

        mContentView = inflater.inflate(R.layout.webview, null);
        mWeb = (WebView)mContentView.findViewById(R.id.webview);

        WebSettings settings = mWeb.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setSupportZoom(false);
        mWeb.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        mWeb.getSettings().setBuiltInZoomControls(false);
        mWeb.loadUrl("myurl...");
        mWeb.setOnKeyListener(new OnKeyListener(){

            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK 
                        && event.getAction() == MotionEvent.ACTION_UP 
                        && mWeb.canGoBack()) {
                    handler.sendEmptyMessage(1);
                    return true;
                }

                return false;
            }

        });

    }   

    private void webViewGoBack(){
        mWeb.goBack();
    }
}
Run Code Online (Sandbox Code Playgroud)


Bla*_*elt 21

实际上你不能直接在片段里面做.本onBackPressed可以在被覆盖FragmentActivity.你能做的是:

  1. 覆盖onBackPressed活动内部.
  2. onBackPressed被调用时,检查当前片段的实例是示出该实例webview.
  3. 如果是,请询问fragment是否webview可以返回.
  4. 如果不是,请拨打super您需要的或其他任何内容

编辑:

 @Override
 public void onBackPressed() {
       Fragment webview = getSupportFragmentManager().findFragmentByTag("webview");
       if (webview instanceof MyWebViewFragment) {
              boolean goback = ((MyWebViewFragment)webview).canGoBack();
              if (!goback)
                super.onBackPressed();
       }
 }
Run Code Online (Sandbox Code Playgroud)

  • 感谢您使用此代码,真正帮助我快速解决了导航抽屉和片段webview所遇到的问题. (2认同)

小智 19

你可以查看这段代码:

    webView.canGoBack();
    webView.setOnKeyListener(new View.OnKeyListener() {

        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK
                    && event.getAction() == MotionEvent.ACTION_UP
                    && webView.canGoBack()) {
                webView.goBack();
                return true;
            }
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止最好的答案,应该可以正常工作,谢谢。 (2认同)

Ram*_*tra 6

WebViewActivity.java,我添加了1个方法:

@Override
public void onBackPressed() {

    WebViewFragment fragment = (WebViewFragment)
            getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
    if (fragment.canGoBack()) {
        fragment.goBack();
    } else {
        super.onBackPressed();
    }
}
Run Code Online (Sandbox Code Playgroud)

WebViewFragment.java,我添加了两种方法:

public boolean canGoBack() {
    return mWebView.canGoBack();
}

public void goBack() {
    mWebView.goBack();
}
Run Code Online (Sandbox Code Playgroud)


Man*_*ger 6

我创建了一个简单的界面:

public interface IOnBackPressed {
    boolean onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

在活动中:

public class MyActivity extends Activity {
    @Override public void onBackPressed() {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_container);
       if (!(fragment instanceof IOnBackPressed) || !((IOnBackPressed) fragment).onBackPressed()) {
          super.onBackPressed();
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

在片段中:

public class MyFragment extends Fragment implements IOnBackPressed {
   @Override
    public boolean onBackPressed() {
        if (webview.canGoBack()) {
            webview.goBack();
            // backpress is not considered in the Activity
            return true;
        } else {
            // activity will act normal
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*e T 5

@RomanBlack 的回答给了我正确的想法,但由于我们使用 kotlin,我不得不稍微调整一下答案。

webView.setOnKeyListener { _, _, keyEvent ->
        if (keyEvent.keyCode == KeyEvent.KEYCODE_BACK && !webView.canGoBack()) {
            false
        } else if (keyEvent.keyCode == KeyEvent.KEYCODE_BACK && keyEvent.action == MotionEvent.ACTION_UP) {
            webView.goBack()
            true
        } else true
    }
Run Code Online (Sandbox Code Playgroud)

如果你想用退货来做,你必须添加如下内容:

return@setOnKeyListener true
Run Code Online (Sandbox Code Playgroud)


Bur*_*lek 5

BackPressedDispatcher 有一个简单的方法

分段:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val callback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            if(webView.canGoBack()){
               webView.goBack()
            } else {
                isEnabled = false
                requireActivity().onBackPressed()
            }
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(this,callback)
}
Run Code Online (Sandbox Code Playgroud)

活动 :

override fun onBackPressed() {
    val fragment = supportFragmentManager.findFragmentByTag("WebViewFragment")
    if (WebViewFragment::class.java.isInstance(fragment)) {
        if (onBackPressedDispatcher.hasEnabledCallbacks()) {
            onBackPressedDispatcher.onBackPressed()
            return
        }
        super.onBackPressed()
    }
}
Run Code Online (Sandbox Code Playgroud)

也许这些代码可以改进,但它对我来说非常有效。欲了解更多信息,请访问此处