WebView'da geri düğmesine basılırsa önceki sayfaya nasıl dönülür?


327

WebViewİçinde bazı web sitelerini görüntülediğim bir uygulama var . Çalışır, web sayfasındaki bir bağlantıyı tıklamak, uygulamamın içindeki web sitesindeki bir sonraki sayfaya gider. Ancak telefonun geri düğmesini tıkladığımda, beni doğrudan uygulamama götürüyor. Bunun yerine web sitesinde bir önceki sayfaya geri dönmek istiyorum. Bunu nasıl yapabilirim?

İşte kullanıyorum kod örneği:

public class Webdisplay extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.webdisplay);

        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
                Window.PROGRESS_VISIBILITY_ON); 

        Toast loadingmess = Toast.makeText(this,
                "Cargando El Diario de Hoy", Toast.LENGTH_SHORT);
        loadingmess.show();

        WebView myWebView;

        myWebView = (WebView) findViewById(R.id.webview);
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.loadUrl("http://www.elsalvador.com");
        myWebView.setWebViewClient(new WebViewClient());
        myWebView.setInitialScale(1);
        myWebView.getSettings().setBuiltInZoomControls(true);
        myWebView.getSettings().setUseWideViewPort(true);

        final Activity MyActivity = this;
        myWebView.setWebChromeClient(new WebChromeClient() 
        {
            public void onProgressChanged(WebView view, int progress)   
            {
                MyActivity.setTitle("Loading...");
                MyActivity.setProgress(progress * 100); 

                if(progress == 100)
                    MyActivity.setTitle(R.string.app_name);
            }
        });
    }
}

Yanıtlar:


520

WebViews ile yaptığım etkinliklerimde şöyle bir şey kullanıyorum:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (mWebView.canGoBack()) {
                    mWebView.goBack();
                } else {
                    finish();
                }
                return true;
        }

    }
    return super.onKeyDown(keyCode, event);
}

Düzenle:

Bu kodun çalışması Activityiçin WebView içeren Web Alanına bir alan eklemeniz gerekir :

private WebView mWebView;

onCreate()Yöntemi başlatın ve gitmek için iyi olmalısınız.

mWebView = (WebView) findViewById(R.id.webView);

1
bu kodu yerleştirmeli miydim? tüm kodum altında? ya da sadece builtinZoom gibi loasUrl altında?
zvzej

3
Etkinliğinizin içine, ancak onCreate () yönteminin dışına koyarsınız.
FoamyGuy

kodunuzu yerleştirdiğinizde bana oncreate dışında beri mWebView değişkeni için bir hata verir, nerede bu değişkeni yerleştirmek gerekir?
zvzej

4
finish()koymak yerinereturn super.onKeyDown(keyCode, event)
Bostone

6
ya da aslında sadece tüm elsebloğu kaldır
Bostone

300

Android 2.2 ve üstü kullanıyorsanız (şu anda çoğu cihazdır), aşağıdaki kod size istediğinizi sağlayacaktır.

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

5
Güzel. Bu cevabın bir varyasyonunu kullanıyorum, ancak "else" bloğu olmadan. Aksi takdirde, kullanıcı çok fazla geri bastığında boş bir uygulama "başlat" ekranında kalır ve kullanıcının ilerlemesi için bir seçenek yoktur.
George Armhold

1
Bu en uygun cevap gibi görünüyor. @CaffeineComa, muhtemelen uygulama başlangıç ​​ekranınızı uygulama "etkinlik" geçmişinde görünmeyecek şekilde kodlayabilirsiniz. Sadece AndroidManifest.xml'de istediğiniz android:noHistory="true"özelliği ekleyin<activity>
LocalPCGuy

Bu olmalı mı return;? Bu yaptığı antrenman rehberi .
Keith

Çok teşekkür ederim!
DmitryKanunnikoff

113

Bu benim çözümüm. Fragment'te de çalışır.

webView.setOnKeyListener(new OnKeyListener()
{
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if(event.getAction() == KeyEvent.ACTION_DOWN)
        {
            WebView webView = (WebView) v;

            switch(keyCode)
            {
                case KeyEvent.KEYCODE_BACK:
                    if(webView.canGoBack())
                    {
                        webView.goBack();
                        return true;
                    }
                    break;
            }
        }

        return false;
    }
});

16
bu benim görüşüm, bu doğru cevap olmalı.
Arvin

2
Bu cevap neden doğru cevap olmalı? İlk iki cevapla ilgili bir sorun mu var?
ca9163d9

12
@ dc7a9163d9 bir etkinliğin keyDown öğesine bağlı olan birkaç görünüm veya nesneye sahip olmasını isteyebilirsiniz. bu cevap, aktivitenin webview (daha iyi tasarım olan) ile bağımlılığı azaltma ihtiyacını ortadan kaldırmaktadır. ayrıca, daha yeni uygulamalar neredeyse tamamen etkinliklerin aksine parçaları kullanır ve bu cevap diğerlerinin aksine bu kullanım durumunu destekler
David T.

Bu yaklaşımı seviyorum. Tüm etkinlik yerine sadece WebView dinliyor
davejoem

Bunun daha iyi olduğunu kabul edin, bu nedenle ana etkinliğin yalnızca parçalar tarafından kullanılan bir WebView tutması gerekmez.
Jannik

18

Sonraki düğme ve ilerleme çubuğu için tam referans: web görünümünde geri ve sonraki düğme

Telefonun geri düğmesini tıkladığınızda arka sayfaya gitmek istiyorsanız, şunu kullanın:

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

Ayrıca aşağıdaki gibi özel geri düğmesi de oluşturabilirsiniz:

btnback.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (wv.canGoBack()) {
                wv.goBack();
            }
        }
    }); 

16

Odaklanma ayrıca üzerinde kontrol edilmelidir.

    @Override
    public void onBackPressed() {
        if (mWebview.isFocused() && mWebview.canGoBack()) {
            mWebview.goBack();       
        } else {
            super.onBackPressed();
            finish();
        }
    }

2
Kulağa mantıklı geliyor, lütfen nedenini açıklayabilir misiniz?
SharpC

14

Neden kullanmıyorsunuz onBackPressed()?

@Override
public void onBackPressed()
{
    // super.onBackPressed(); Do not call me!

    // Go to the previous web page.
}

çünkü sadece sdk 2.2 ve üstü bu yöntemi desteklemektedir .. sdk 1.6 ile çalışmaz
Maher Abuthraa

1
otoh, Honeycomb ve daha yeni bir donanım geri anahtarına sahip değildir, bunun sonucunda onKeyDown asla çağrılmaz.
junkdog

10

İşte çıkış onayla bir kod:

@Override
    public void onBackPressed()
    {
        if(webView.canGoBack()){
            webView.goBack();
        }else{
            new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setTitle("Exit!")
            .setMessage("Are you sure you want to close?")
            .setPositiveButton("Yes", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();    
                }

            })
            .setNegativeButton("No", null)
            .show();    
        }   
    }

6
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if the key event was the Back button and if there's history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
    // If it wasn't the Back key or there's no web page history, bubble up to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
}

3

Kotlin'de:

override fun onBackPressed() {
    when {
        webView.canGoBack() -> webView.goBack()
        else -> super.onBackPressed()
    }
}

webView - sentetik referans kullanılıyorsa xml'deki webview bileşeninin kimliği.


2

FoamyGuy'un ilk cevabı doğru ama bazı eklemeler var; düşük itibar, yorum yapmama izin veremez. Bazı nedenlerden dolayı sayfanız yüklenemezse, hatayı not etmek için bir bayrak ayarladığınızdan emin olun ve ardından onBackPressed geçersiz kılmasında kontrol edin. Aksi takdirde, canGoBack () öğeniz , varsa gerçek geri etkinliğe gitmeden sonsuza kadar yürütülür :

//flag with class wide access 
public boolean ploadFailFlag = false;

//your error handling override
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
    onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());
    ploadFailFlag = true;       //note this change 
    .....
    .....
}

//finally to the answer to this question:
@Override
public void onBackPressed() {
    if(checkinWebView.canGoBack()){
        //if page load fails, go back for web view will not go back - no page to go to - yet overriding the super 
        if(ploadFailFlag){
            super.onBackPressed();
        }else {
            checkinWebView.goBack();
        }
    }else {
        Toast.makeText(getBaseContext(), "super:", Toast.LENGTH_LONG).show();
        super.onBackPressed();
    }
}

1

Sınıfınızdaki aşağıdaki kitaplıklar onBackKeyPressed'i kullanmalısınız. canGoBack (), web görünümünün bir önceki sayfaya referans verip vermediğini kontrol eder. Mümkünse, önceki sayfaya başvurmak için goBack () işlevini kullanın (geri dön).

 @Override
        public void onBackPressed() {
          if( mWebview.canGoBack()){
               mWebview.goBack(); 
           }else{
            //Do something else. like trigger pop up. Add rate app or see more app
           }
  }

1

İşte Kotlin çözümü:

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    if (event?.action != ACTION_UP || event.keyCode != KEYCODE_BACK) {
        return super.onKeyUp(keyCode, event)
    }

    if (mWebView.canGoBack()) {
        mWebView.goBack()
    } else {
        finish()
    }
    return true
}

0

Resmi Kotlin Yolu:

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    // Check if the key event was the Back button and if there's history
    if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) {
        myWebView.goBack()
        return true
    }
    // If it wasn't the Back key or there's no web page history, bubble up to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event)
}

https://developer.android.com/guide/webapps/webview.html#NavigatingHistory


0

Birisi bir parçanın içindeki bir webView için backPressed öğesini işlemek istiyorsa , aşağıdaki kodu kullanabilir.

  1. Aşağıdaki kodu Activitysınıfınıza kopyalayın (bir parça içerir YourFragmmentName)

    @Override
    public void onBackPressed() {
    List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
    
    boolean handled = false;
    for(Object f: fragmentList) {
        if(f instanceof YourFragmentName) {
            handled = ((YourFragmentName)f).onBackPressed();
            if(handled) {
                break;
            }
        }
    }
    
    if(!handled) {
        super.onBackPressed();
    }

    }

  2. Bu kodu parçaya kopyala YourFragmentName

    public boolean onBackPressed() {
       if (webView.canGoBack()) {
           webView.goBack();
           return true;
       } else {
           return false;
       }
    }

notlar

  • Activity kullandığınız gerçek Acitivity sınıfıyla değiştirilmelidir.
  • YourFragmentName Parçanızın adıyla değiştirilmelidir.
  • Bildirmek webViewolarak YourFragmentNamebu işlev içinde erişilebilir, böylece.

0

Bir fragmanda web görünümü için bunu deneyebilirsiniz:

private lateinit var webView: WebView

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val root = inflater.inflate(R.layout.fragment_name, container, false)
    webView = root!!.findViewById(R.id.home_web_view)
    var url: String = "http://yoururl.com"
    webView.settings.javaScriptEnabled = true
    webView.webViewClient = WebViewClient()
    webView.loadUrl(url)
    webView.canGoBack()
    webView.setOnKeyListener{ v, keyCode, event ->
        if(keyCode == KeyEvent.KEYCODE_BACK && event.action == MotionEvent.ACTION_UP
            && webView.canGoBack()){
            webView.goBack()
            return@setOnKeyListener true
        }
        false
    }
    return root
}

-2

sayfaya geri dönmek ve son sayfa geldiğinde etkinlikten çıkmak için bu kodu kullanın

 @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent=new Intent(LiveImage.this,DashBoard.class);
        startActivity(intent);
    }

-5

Faaliyette Web Görünümü, Kod benim için çalıştı, Webview.in'deki Url'yi yükledikten sonra aktiviteyi bitirin.

 webView = (WebView) findViewById(R.id.info_webView);
 webView.loadUrl(value);
 finish();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.