web-dev-qa-db-de.com

Wie füge ich die "Zurück" -Funktion in WebView in Fragment hinzu?

UPDATE: Gelöst! Das Problem war mit meinem Viewpager und nicht mit WebView verbunden.

Ich versuche, meiner WebView eine "Zurück" -Funktion hinzuzufügen, die sich in einer Fragment befindet. Aber ich kann nicht herausfinden, wie ich:

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 so etwas ausprobiert:

@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 dasselbe Problem:

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

Irgendwelche Ideen, wie das funktioniert?

25
Markus Rubey

Vielleicht seine Android-Einschränkung. Versuchen Sie dies mit einem 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();
    }
}
41
Roman Black

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

  1. Überschreiben Sie onBackPressed in der Aktivität.
  2. Überprüfen Sie beim Aufruf von onBackPressed, ob die Instanz des aktuellen Fragments die Instanz ist, die webview zeigt.
  3. Wenn ja, fragen Sie den fragment, ob der webview zurückgehen kann. 
  4. wenn dies nicht der Fall ist, rufen Sie super oder was immer Sie benötigen

Bearbeiten:

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

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

In WebViewActivity.Java habe ich 1 Methode hinzugefügt:

@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 hinzugefügt:

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

public void goBack() {
    mWebView.goBack();
}
5
Ram Patra

meine Lösung war in Fragment, das ich öffentlichen Methoden hinzufügte

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

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

dann rufe ich von Aktivität an

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

}

note Hinweis Der mwebview ist statisch

3
Omid Aminiva

sie können dies durch:

  • in der Activity setzen:

    // Set WebView
    
    public void setWebView(WebView web) {
    
        this.web = web;
    }
    
  • im Webfragment nach ActivityCreated() setzen:

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

  • Vergessen Sie nicht, webView von der onCreateView() wie folgt einzustellen:

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

@ 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 es mit Retouren machen wollen, müssen Sie Folgendes hinzufügen:

[email protected] true
1
Mike T

@OmidAmnivia Antwort ist richtig Ihre App 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 prüfen, ob Ihre Klasse initialisiert wurde oder nicht. 

1
h_code

Ich habe eine einfache Schnittstelle erstellt:

public interface IOnBackPressed {
    boolean onBackPressed();
}

in der Aktivität:

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

im Fragment:

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

Vor allem in Fragment zurückgepresst

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

hoffe es wird klappen.

0
Dalvinder Singh

So habe ich es in meiner App gemacht. Ich konsumiere Presseveranstaltungen, bis die Webansicht zurückgehen kann. Sobald die Webansicht nicht mehr angezeigt werden kann, zeige ich dem Benutzer einen Hinweis, dass die App beendet wird, wenn er weiter zurückdrückt. 

Es gibt Benutzern die Chance, in Ihrer App zu bleiben, wenn Webview nicht mehr zurückkehren kann. Ich fand es benutzerfreundlicher:

          //time passed between two back presses.
          private val TIME_INTERVAL = 200 
           // variable to keep track of last back press
          private var mBackPressed: Long = 0


        webView!!.requestFocus()
        webView.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->
            if (keyCode == KeyEvent.KEYCODE_BACK
                    && event.action == MotionEvent.ACTION_UP
                  ) {
                if(webView.canGoBack()) {
                    //go back in previous page
                    webView.goBack()
                    [email protected] true
                }
                else
                {
                    if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis())
                    {   // dont consume back press and pass to super
                        [email protected] false
                    }
                    else {
                        // show hint for double back press
                        Toast.makeText(context, " Double Tap back button to exit the demo", Toast.LENGTH_SHORT).show();
                        mBackPressed = System.currentTimeMillis();
                        [email protected] true
                    }
                }
            }
            [email protected] false

        })
0
Hitesh Sahu