Android?WebView的使用與后退鍵處理詳細(xì)討論
前言
webView是Android中常用的組件之一,用于展示網(wǎng)頁內(nèi)容。它可以加載HTML文件、URL鏈接等網(wǎng)頁內(nèi)容,并提供交互功能。在使用webView時(shí),我們經(jīng)常會(huì)涉及到后退鍵處理,下面讓我們?cè)敿?xì)討論一下webView的使用和后退鍵處理。
首先,我們需要在布局文件中添加webView組件
<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" />
在Activity中獲取webView實(shí)例,并加載網(wǎng)頁內(nèi)容
:
WebView webView = findViewById(R.id.webView); webView.loadUrl("http://www.example.com");
以上代碼中,我們獲取了布局文件中的webView組件,并使用loadUrl()方法加載了指定的URL鏈接。如果要加載本地的HTML文件,可以使用loadUrl(“file:///android_asset/your_file.html”)方法。
當(dāng)webView加載網(wǎng)頁時(shí),我們可能需要處理一些事件,比如點(diǎn)擊鏈接時(shí)打開新網(wǎng)頁、后退鍵按下時(shí)返回上一頁等。下面我們來詳細(xì)討論一下后退鍵處理。
首先,在Activity中重寫onKeyDown()方法,用于監(jiān)聽后退鍵的按下事件:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { //處理后退鍵事件 return true; } return super.onKeyDown(keyCode, event); }
在上述代碼中,我們判斷了按下的鍵是否為后退鍵,并且事件的動(dòng)作是否為按下(ACTION_DOWN)。如果條件成立,則表示后退鍵被按下,我們可以在條件成立的地方添加我們的后退邏輯。
在webView中,我們可以使用goBack()方法來返回上一頁。所以,在后退鍵按下時(shí),我們可以調(diào)用webView的goBack()方法來實(shí)現(xiàn)返回上一頁的功能。具體代碼如下:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { if (webView.canGoBack()) { //如果webView可以返回上一頁,則調(diào)用goBack()方法返回上一頁 webView.goBack(); } else { //否則,執(zhí)行其他邏輯(比如退出Activity) finish(); } return true; } return super.onKeyDown(keyCode, event); }
在上述代碼中,我們添加了一個(gè)判斷語句,判斷webView是否可以返回上一頁。如果可以,則調(diào)用webView的goBack()方法返回上一頁。如果不可以,則執(zhí)行其他邏輯(比如退出Activity)。
另外,我們還可以通過監(jiān)聽webView的歷史記錄來判斷是否可以返回上一頁。webView提供了一個(gè)WebViewClient類,該類中有一個(gè)shouldOverrideUrlLoading()方法,可以用于監(jiān)聽webView的url加載事件。我們可以通過重寫該方法,并在方法中判斷webView的歷史記錄來判斷是否可以返回上一頁。具體代碼如下:
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (webView.canGoBack()) { //如果webView可以返回上一頁,則調(diào)用goBack()方法返回上一頁 webView.goBack(); } else { //否則,執(zhí)行其他邏輯(比如退出Activity) finish(); } return true; } });
在上述代碼中,我們通過webView的setWebViewClient()方法設(shè)置了一個(gè)新的WebViewClient實(shí)例,并重寫了其shouldOverrideUrlLoading()方法。在方法中,我們判斷了webView是否可以返回上一頁,如果可以,則調(diào)用goBack()方法返回上一頁。如果不可以,則執(zhí)行其他邏輯(比如退出Activity)。
除了上述的代碼實(shí)現(xiàn)方式,我們還可以通過webView的WebChromeClient類來監(jiān)聽后退鍵的按下事件。WebChromeClient類有一個(gè)onKeyDown()方法,可以用于監(jiān)聽鍵盤按鍵的按下事件。具體代碼如下:
webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { if (webView.canGoBack()) { //如果webView可以返回上一頁,則調(diào)用goBack()方法返回上一頁 webView.goBack(); } else { //否則,執(zhí)行其他邏輯(比如退出Activity) finish(); } return true; } return super.onKeyDown(keyCode, event); } });
在上述代碼中,我們通過webView的setWebChromeClient()方法設(shè)置了一個(gè)新的WebChromeClient實(shí)例,并重寫了其onKeyDown()方法。在方法中,我們判斷了按下的鍵是否為后退鍵,并且事件的動(dòng)作是否為按下(ACTION_DOWN)。如果條件成立,則表示后退鍵被按下,我們可以在條件成立的地方添加我們的后退邏輯。
以上就是webView的使用和后退鍵處理的詳細(xì)討論。對(duì)于webView的使用,我們可以通過loadUrl()方法加載網(wǎng)頁內(nèi)容,還可以監(jiān)聽webView的各種事件來實(shí)現(xiàn)特定的功能。而對(duì)于后退鍵處理,我們可以重寫Activity的onKeyDown()方法,通過判斷后退鍵的按下事件來實(shí)現(xiàn)返回上一頁的功能。同時(shí),我們還可以通過監(jiān)聽webView的歷史記錄或使用WebChromeClient來實(shí)現(xiàn)后退鍵的處理。
附:Android 開發(fā)之webview頁面返回到最頂關(guān)閉
public class MyWebViewActivity extends Activity { private Context context = this; // 底部菜單View // public static View bottomView; private WebViewProgressBar webView; private String url; private HtmlBean bean; // 手勢(shì) private GestureDetector mGestureDetector; private TextView btn_goback; String title; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.usershop_layout); MyUtils.checkStrictMode(true); url = getIntent().getStringExtra("url"); if (!TextUtils.isEmpty(title)) { TextView tv_title = (TextView) findViewById(R.id.title_text); if (title.length() > 6) { title = title.substring(0, 6); } tv_title.setText(title); } if (TextUtils.isEmpty(url)) { Toast.makeText(this, "沒有找到相關(guān)的鏈接地址", Toast.LENGTH_LONG).show(); return; } initWebView(); this.initJsInterface(); initGestureDetector(); } // 初始化webView private void initWebView() { // 底部菜單 // bottomView = findViewById(R.id.user_bottom); btn_goback=(TextView)findViewById(R.id.btn_goback); // WebView webView = (WebViewProgressBar) findViewById(R.id.user_webview); // 滾動(dòng)條 webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); // 腳本支持 webView.getSettings().setJavaScriptEnabled(true); // 縮放 webView.getSettings().setSupportZoom(true); webView.loadUrl(url); // WebView客戶端 webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String nextUrl) { // 下一個(gè)鏈接 try { if(title.equals("個(gè)人中心")){ url=nextUrl; } } catch (Exception e) { } view.loadUrl(nextUrl); return true; } // 開始加載 @Override public void onPageStarted(WebView view, String url2, Bitmap favicon) { // TODO Auto-generated method stub } // 加載完畢 @Override public void onPageFinished(WebView view, String url2) { } }); btn_goback.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); // WebView的滑動(dòng)事件交個(gè)手勢(shì)處理 webView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub return mGestureDetector.onTouchEvent(event); } }); } // 初始化手勢(shì) private void initGestureDetector() { mGestureDetector = new GestureDetector(this, new OnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } }, new Handler() { }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { ShareDao.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); } public void btn_on(View view){ if(webView.canGoBack()){ webView.goBack(); // goBack()表示返回WebV }else { finish(); } } } }
總結(jié)
到此這篇關(guān)于Android WebView的使用與后退鍵處理的文章就介紹到這了,更多相關(guān)Android WebView使用與后退鍵內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android自定義View Flyme6的Viewpager指示器
這篇文章主要為大家詳細(xì)介紹了Android自定義View Flyme6的Viewpager指示器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android 仿微信朋友圈點(diǎn)贊和評(píng)論彈出框功能
這篇文章主要介紹了Android 仿微信朋友圈點(diǎn)贊和評(píng)論彈出框功能的相關(guān)資料,非常不錯(cuò),具有參考解決價(jià)值,需要的朋友可以參考下2016-11-11Android App開發(fā)中使用RecyclerView替代ListView的實(shí)踐
RecyclerView是Android L即5.0版本以來新加入的一個(gè)組件,主要用來實(shí)現(xiàn)item的瀑布式排列,因而被人們廣泛認(rèn)為用來替代ListView,這里我們就來看一下Android App開發(fā)中使用RecyclerView替代ListView的實(shí)踐:2016-06-06Android Studio下Flutter環(huán)境搭建圖文教程
這篇文章主要為大家詳細(xì)介紹了Android Studio下Flutter環(huán)境搭建圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07React-Native Android 與 IOS App使用一份代碼實(shí)現(xiàn)方法
這篇文章主要介紹了React-Native Android 與 IOS App使用一份代碼實(shí)現(xiàn)方法的相關(guān)資料,這里舉例說明,該如何實(shí)現(xiàn)IOS和Android APP 都使用一樣的代碼,需要的朋友可以參考下2016-12-12Android listview動(dòng)態(tài)加載列表項(xiàng)實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android listview動(dòng)態(tài)加載列表項(xiàng)實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android系統(tǒng)檢測(cè)程序內(nèi)存占用各種方法
這篇文章主要介紹了Android系統(tǒng)檢測(cè)程序內(nèi)存占用各種方法,本文講解了檢查系統(tǒng)總內(nèi)存、檢查某個(gè)程序的各類型內(nèi)存占用、檢查程序狀態(tài)、檢查程序各部分的內(nèi)存占用等內(nèi)容,需要的朋友可以參考下2015-03-03Android編程入門之HelloWorld項(xiàng)目目錄結(jié)構(gòu)分析
這篇文章主要介紹了Android編程入門之HelloWorld項(xiàng)目目錄結(jié)構(gòu)分析,較為詳細(xì)的分析了Android項(xiàng)目的目錄結(jié)構(gòu)與具體作用,需要的朋友可以參考下2015-12-12