2012-05-17 30 views
19

ACTUALIZACIÓN: ¡Resuelto! El problema estaba relacionado con mi Viewpager, no con WebView.Cómo agregar la función "Volver atrás" en WebView dentro de Fragment?

Estoy tratando de agregar una función "Volver" a mi WebView que está dentro de Fragment. Pero no puedo encontrar la manera de:

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; 
      } 
     }); 
    } 
} 

También hemos probado algo así como:

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

Otra solución, pero mismo problema:

@Override 
public void onBackPressed() 
{ 
    if(webView.canGoBack()) 
     webView.goBack(); 
    else 
     super.onBackPressed(); 
} 

Alguna idea de cómo conseguir este trabajo ?

+0

¿Qué ocurre? la tercera opción que implementa onBackPressed() me funciona, asegúrese de que realmente tiene algo a lo que recurrir. –

+0

y el problema era? Tengo una situación muy similar :) – desgraci

+0

[¿Cómo volver a la página anterior si se presiona el botón Atrás en WebView?] (Https://stackoverflow.com/q/6077141/6521116) –

Respuesta

20

Actualmente no se puede hacer directamente dentro del fragmento. El onBackPressed puede anularse en el FragmentActivity. Lo que puede hacer es:

  1. Reemplazar el onBackPressed dentro de la actividad.
  2. Cuando se llama al onBackPressed, compruebe si la instancia del fragmento actual es la instancia que muestra webview.
  3. Si es así, pregunte en el fragment si el webview puede volver atrás.
  4. si no es así, llame a la super o lo que usted necesita

Editar:

@Override 
public void onBackPressed() { 
     Fragment webview = getSupportFragmentManager().findFragmentByTag("webview"); 
     if (webview instanceof MyWebViewFragment) { 
       boolean goback = ((MyWebViewFragment)webview).canGoBack(); 
       if (!goback) 
       super.onBackPressed(); 
     } 
} 
+2

Gracias por este código, realmente me ayudó proporcionar una solución rápida a los problemas que estaba teniendo con un cajón de navegación y fragmento webview. –

36

Tal vez su restricción androide. Intente hacer esto usando el controlador.

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(); 
    } 
} 
+0

mWeb.setOnKeyListener hizo el truco para mí, Muchas gracias –

+1

Funcionó para mí también, Esto debería ser seleccionado como respuesta! –

+1

esto funciona, sin embargo, hay un error. Solo está detectando el código de clave, no el evento clave. Entonces, cuando presionas el botón Atrás, obtienes la llamada de OnKey dos veces, para la de downpress y otra para la de arriba. Entonces debería ser: if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_UP) { –

2

usted puede hacer esto por:

  • en el puesto Activity:

    // Set WebView 
    
    public void setWebView(WebView web) { 
    
        this.web = web; 
    } 
    
  • en el fragmento web después de ActivityCreated() puesto:

    ((Your_Activity) getActivity()).setWebView(webView);

  • No se olvide de establecer webView del onCreateView() como estos:

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
        webView = (WebView) inflater.inflate(R.layout.your_web_fragment, container, 
          false); 
        return web; 
    } 
    
3

mi solución estaba en el fragmento he añadido a los métodos públicos

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

    public static void goBack(){ 
     mWebView.goBack(); 
    } 

continuación de la actividad que llamo

@Override 
public void onBackPressed() { 
    if(webFragment.canGoBack()){ 
     webFragment.goBack(); 
    }else{ 
     super.onBackPressed(); 
    } 

} 

Nota El mwebview es s tatic

5

En WebViewActivity.java, añadí 1 Método:

@Override 
public void onBackPressed() { 

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

En WebViewFragment.java, añadí 2 métodos:

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

public void goBack() { 
    mWebView.goBack(); 
} 
1

respuesta @OmidAmnivia es correcta su aplicación la solución al choque es

@Override 
public void onBackPressed() { 
if(webFragment.isInitialized && webFragment.canGoBack()){ 
    webFragment.goBack(); 
}else{ 
    super.onBackPressed(); 
} 
} 

Debes comprobar si tu clase ha sido iniciada Sed o no.

0

En primer lugar obtener la espalda apoyada en el fragmento

mContentView.setFocusableInTouchMode(true); 
mContentView.requestFocus(); 
mContentView.setOnKeyListener(new OnKeyListener() 
{ 
    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) 
    { 
     if(keyCode == KeyEvent.KEYCODE_BACK) 
     { 
     if (mWebView.canGoBack()) { 
       mWebView.goBack(); 
       retune false; 
      } else { 
       return true; 
      } 

     } 
     return false; 
    } 
}); 

Esperamos que se puede obras.

1

@ La respuesta de RomanBlack me dio la idea correcta, pero como utilizamos kotlin tuve que adaptar la respuesta un poco.

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 
    } 

si quiere hacerlo con rendimientos hay que añadir algo como:

[email protected] true 
2

Puede comprobar este código:

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; 
     } 
    }); 
Cuestiones relacionadas