Giới thiệu
WebView không hỗ trợ trực tiếp OnClickListener. Ví dụ này minh họa cách phát hiện người dùng chạm (tap) vào WebView bằng cách kết hợp OnTouchListener và Handler để phân biệt giữa click vào WebView và click vào link bên trong trang web.
Bước 1: Tạo dự án mới
Tạo project Android Studio: File → New Project.
Bước 2: Layout - WebView (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Bước 3: MainActivity - Xử lý touch và click
Sử dụng Handler với delay 500ms để phân biệt: nếu có ACTION_MOVE trong 500ms thì coi là scroll, không thì coi là click. shouldOverrideUrlLoading xử lý click vào link.
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnTouchListener, Handler.Callback {
private static final int CLICK_ON_WEBVIEW = 1;
private static final int CLICK_ON_URL = 2;
private final Handler handler = new Handler(this);
WebView webView;
WebViewClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView);
webView.setOnTouchListener(this);
client = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
handler.sendEmptyMessage(CLICK_ON_URL);
return false;
}
};
webView.setWebViewClient(client);
webView.setVerticalScrollBarEnabled(false);
webView.loadUrl("https://www.google.com");
}
@Override
public boolean handleMessage(Message msg) {
if (msg.what == CLICK_ON_URL) {
handler.removeMessages(CLICK_ON_WEBVIEW);
return true;
}
if (msg.what == CLICK_ON_WEBVIEW) {
Toast.makeText(this, "WebView được click", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == R.id.webView && event.getAction() == MotionEvent.ACTION_DOWN) {
handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 500);
}
return false;
}
}
Bước 4: Manifest - Quyền Internet
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Chạy ứng dụng
Chạy app, chạm vào vùng trống của WebView sẽ hiển thị Toast "WebView được click", click vào link sẽ điều hướng bình thường mà không hiện Toast.