2012-05-17 4 views
19

UPDATE: Gelöst! Problem wurde mit meinem Viewpager nicht WebView in Verbindung gebracht.Wie fügt man "Zurück" Funktion in WebView innerhalb Fragment?

Ich versuche, eine "Zurück" -Funktion zu meinem WebView, die in einem Fragment ist. Aber ich kann nicht herausfinden, wie man:

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

Ich habe auch versucht, so etwas wie:

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

Eine andere Lösung, aber gleiches Problem:

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

Irgendwelche Ideen, wie diese Funktion zu erhalten ?

+0

Was passiert? Die dritte Option, die onBackPressed() implementiert, funktioniert für mich, stellen Sie sicher, dass Sie tatsächlich etwas haben, zu dem Sie zurückkehren können. –

+0

und das Problem war? Ich habe eine sehr ähnliche Situation :) – desgraci

+0

[Wie gehe ich zurück zur vorherigen Seite, wenn Zurück-Taste in WebView gedrückt wird?] (Https://stackoverflow.com/q/6077141/6521116) –

Antwort

20

Eigentlich können Sie nicht direkt in das Fragment tun. Die onBackPressed kann in der FragmentActivity überschrieben werden. Was Sie tun können, ist:

  1. Überschreiben Sie die onBackPressed innerhalb der Aktivität.
  2. Wenn die onBackPressed aufgerufen wird, überprüfen Sie, ob die Instanz des aktuellen Fragments die Instanz mit der webview ist.
  3. Wenn es ist, fragen Sie die fragment, wenn die webview zurückgehen kann.
  4. wenn es nicht, rufen Sie die super ist oder was auch immer Sie

bearbeiten müssen:

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

Danke für diesen Code, hat mir wirklich geholfen bieten eine schnelle Lösung für die Probleme, die ich mit einer Navigationsschublade und fragment webview hatte. –

36

Vielleicht seine Android-Beschränkung. Versuchen Sie dies mit dem Handler.

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 hat den Trick für mich gemacht, Vielen Dank –

+1

Arbeitete auch für mich, Dies sollte als Antwort ausgewählt werden! –

+1

das funktioniert, aber es gibt einen Fehler. Sie erkennen nur den keyCode, nicht das KeyEvent. Also, wenn Sie den Zurück-Knopf drücken, werden Sie OnKey zweimal aufgerufen, für den Downpress und einen für den Up. So sollte es sein: if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_UP) { –

2

Sie können dies tun, indem:

  • im Activity Put:

    // Set WebView 
    
    public void setWebView(WebView web) { 
    
        this.web = web; 
    } 
    
  • im Web-Fragment nach ActivityCreated() Put:

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

  • Vergessen Sie nicht, webView vom onCreateView() wie diese gesetzt:

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

meine Lösung war in Fragment ich öffentliche Methoden hinzugefügt

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

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

dann von Aktivität nenne ich

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

} 

Hinweis Die Mwebview ist s tatic

5

In WebViewActivity.java, habe ich 1-Methode:

@Override 
public void onBackPressed() { 

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

In WebViewFragment.java, habe ich 2 Methoden:

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

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

@OmidAmnivia Antwort richtig Ihre Anwendung ist die Lösung für den Absturz ist

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

Sie müssen überprüfen, ob Ihre Klasse initialisiert wurde sed oder nicht.

0

Zunächst einmal zurück in Fragmente gedrückt

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

hoffen, dass es funktioniert wird.

1

@RomanBlacks Antwort gab mir die richtige Idee, aber da wir Kotlin verwenden, musste ich die Antwort ein wenig anpassen.

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 
    } 

wenn Sie wollen, es zu tun mit kehren Sie so etwas wie hinzufügen:

[email protected] true 
2

Sie können diesen Code überprüfen:

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