Bagaimana cara kembali ke halaman sebelumnya jika tombol kembali ditekan di WebView?

327

Saya memiliki aplikasi WebViewtempat saya menampilkan beberapa situs web. Ini berfungsi, mengklik tautan di halaman web menuju halaman berikutnya di situs web di dalam aplikasi saya. Tetapi ketika saya mengklik tombol kembali ponsel, itu membawa saya langsung ke aplikasi saya. Saya ingin kembali ke halaman sebelumnya di situs web. Bagaimana saya bisa melakukan ini?

Berikut ini contoh kode yang saya gunakan:

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

Jawaban:

520

Saya menggunakan sesuatu seperti ini dalam kegiatan saya dengan WebViews:

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

Edit:

Agar kode ini berfungsi, Anda perlu menambahkan bidang ke yang Activityberisi WebView:

private WebView mWebView;

Inisialisasi dalam onCreate()metode dan Anda harus baik-baik saja.

mWebView = (WebView) findViewById(R.id.webView);
FoamyGuy
sumber
1
apakah saya harus menempatkan kode itu? di bawah semua kode saya? atau tepat di bawah loasUrl seperti builtinZoom?
zvzej
3
Anda memasukkannya ke dalam aktivitas Anda, tetapi di luar metode onCreate ().
FoamyGuy
ketika saya menempatkan kode Anda itu memberi saya kesalahan untuk variabel mWebView karena sudah keluar dari oncreate, di mana saya harus menempatkan variabel itu?
zvzej
4
bukannya finish()putreturn super.onKeyDown(keyCode, event)
Bostone
6
atau bahkan cukup dengan menghapus seluruh elseblok
Bostone
301

Jika menggunakan Android 2.2 dan lebih tinggi (yang merupakan sebagian besar perangkat sekarang), kode berikut akan memberi Anda apa yang Anda inginkan.

@Override
public void onBackPressed() {
    if (webView.canGoBack()) {
        webView.goBack();
    } else {
        super.onBackPressed();
    }
}
Kevin Westwood
sumber
5
Bagus. Saya menggunakan variasi jawaban ini, tetapi tanpa blok "lain". Kalau tidak, ketika pengguna menekan kembali terlalu sering mereka berakhir di layar "mulai" aplikasi kosong, tanpa opsi bagi pengguna untuk bergerak maju.
George Armhold
1
Ini sepertinya jawaban yang paling tepat. @CaffeineComa, Anda mungkin bisa hanya kode layar mulai aplikasi Anda untuk tidak ditampilkan dalam riwayat "aktivitas" aplikasi. Cukup tambahkan android:noHistory="true"atribut di yang <activity>Anda inginkan, di AndroidManifest.xml
LocalPCGuy
Haruskah ini return;? Itu ada dalam panduan pelatihan .
Keith
Terima kasih banyak!
DmitryKanunnikoff
113

Ini solusi saya. Ia bekerja juga di Fragment.

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;
    }
});
petrnohejl
sumber
16
ini pendapat saya, ini harus menjadi jawaban yang tepat.
Arvin
2
Mengapa jawaban ini harus menjadi jawaban yang tepat? Ada masalah dengan dua jawaban teratas?
ca9163d9
12
@ dc7a9163d9 suatu aktivitas mungkin ingin memiliki beberapa tampilan atau objek yang bergantung pada keyDown. jawaban ini mengabstraksi kebutuhan akan aktivitas untuk ketergantungan keydown melalui tampilan web (yang merupakan desain yang lebih baik). juga, aplikasi yang lebih baru hampir secara eksklusif menggunakan fragmen sebagai lawan aktivitas, dan jawaban ini mendukung use case yang bertentangan dengan yang lain
David T.
Saya suka pendekatan ini. Alih-alih seluruh aktivitas mendengarkan hanya WebView
davejoem
Setuju ini lebih baik, jadi aktivitas utama tidak perlu memegang WebView hanya digunakan oleh fragmen.
Jannik
18

Referensi lengkap untuk tombol dan bilah kemajuan berikutnya: masukkan kembali dan tombol berikutnya di tampilan web

Jika Anda ingin membuka halaman belakang saat mengklik tombol kembali ponsel, gunakan ini:

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

Anda juga dapat membuat tombol kembali khusus seperti ini:

btnback.setOnClickListener(new View.OnClickListener() {

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

            if (wv.canGoBack()) {
                wv.goBack();
            }
        }
    }); 
Parsania Hardik
sumber
16

Pemfokusan juga harus diperiksa di diBackPressed

    @Override
    public void onBackPressed() {
        if (mWebview.isFocused() && mWebview.canGoBack()) {
            mWebview.goBack();       
        } else {
            super.onBackPressed();
            finish();
        }
    }
Zar E Ahmer
sumber
2
Kedengarannya masuk akal, bisa tolong jelaskan mengapa?
SharpC
14

Kenapa tidak digunakan onBackPressed()?

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

    // Go to the previous web page.
}
Gyan alias Gary Buyn
sumber
karena hanya SDK 2.2 dan lebih tinggi mendukung metode ini .. tidak berfungsi dengan SDK 1.6
Maher Abuthraa
1
otoh, Honeycomb dan yang lebih baru tidak memiliki kunci belakang perangkat keras, sehingga onKeyDown tidak pernah dipanggil.
Junkog
10

di sini adalah kode dengan konfirmasi keluar:

@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();    
        }   
    }
Mohammed Ahmed
sumber
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);
}
Mahesh
sumber
3

Di kota:

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

webView - id dari komponen tampilan web di xml, jika menggunakan referensi sintetis.

vishnu benny
sumber
2

Jawaban pertama oleh FoamyGuy benar tetapi saya memiliki beberapa tambahan; reputasi rendah tidak memungkinkan saya untuk berkomentar. Jika karena alasan tertentu halaman Anda gagal dimuat, pastikan bahwa Anda menetapkan tanda untuk mencatat kegagalan dan kemudian memeriksanya pada override diBackPressed. Kalau tidak, canGoBack Anda () akan selamanya dieksekusi tanpa menuju ke aktivitas kembali yang sebenarnya jika ada:

//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();
    }
}
Ajowi
sumber
1

Anda harus pustaka berikut di kelas Anda menangani onBackKeyPressed. canGoBack () memeriksa apakah tampilan web dapat merujuk ke halaman sebelumnya. Jika mungkin maka gunakan fungsi goBack () untuk referensi halaman sebelumnya (kembali).

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

Inilah solusi Kotlin:

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
}
Gibolt
sumber
0

Jalan Kotlin Resmi:

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

SANAT
sumber
0

Jika seseorang ingin menangani backPressed untuk webView di dalam sebuah fragmen , maka dia dapat menggunakan kode di bawah ini.

  1. Salin kode di bawah ini ke Activitykelas Anda (yang berisi fragmen 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. Salin kode ini dalam fragmen YourFragmentName

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

Catatan

  • Activity harus diganti dengan kelas Aktivitas aktual yang Anda gunakan.
  • YourFragmentName harus diganti dengan nama Fragmen Anda.
  • Menyatakan webViewdi YourFragmentNamesehingga dapat diakses dari dalam fungsi.
Faraz Ahmad
sumber
0

Anda dapat mencoba ini untuk tampilan web dalam sebuah fragmen:

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
}
Simbarashe Mupfururirwa
sumber
-2

gunakan kode ini untuk kembali ke halaman dan ketika halaman terakhir datang kemudian keluar dari aktivitas

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

Webview dalam Aktivitas, Kode di bawah ini berfungsi untuk saya, Selesai aktivitas setelah memuat Url di webview.di onback, tekan itu pergi ke aktivitas sebelumnya

 webView = (WebView) findViewById(R.id.info_webView);
 webView.loadUrl(value);
 finish();
Libin Thomas
sumber