【问题标题】:How to get the callback of input area click of a WebView in Android如何在Android中获取WebView的输入区域点击回调
【发布时间】:2016-10-25 03:51:34
【问题描述】:

我正在开发 Android 键盘。键盘包含一个 WebView。当用户在 WebView 中单击网页的输入区域时,应显示键盘面板。在我检查了 WebView 的所有回调之后,我找不到任何回调被调用。我怎么知道用户点击了输入区域并做了什么?

【问题讨论】:

  • 在您的 webview 上使用 javascript 和 javascript 界面绑定
  • @njzk2 网页不像 google.com 一样不受控制。我们无法在页面中添加 javascript。
  • 当然可以。页面加载完成后直接执行js即可。

标签: android webview


【解决方案1】:

试试看:

public class WebViewClicker extends Activity implements 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);

    private WebView webView;
    private WebViewClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web_view_clicker);

        webView = (WebView)findViewById(R.id.web);
        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("http://www.example.com");
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v.getId() == R.id.web && event.getAction() == MotionEvent.ACTION_DOWN){
            handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 500);
        }
        return false;
    }

    @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 clicked", Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
    }

我确实发现 WebView 会将触摸事件发送到 OnTouchListener。它确实有自己的 onTouchEvent 方法,但我似乎只使用该方法获得 MotionEvent.ACTION_MOVE。

因此,鉴于我们可以在已注册的触摸事件侦听器上获取事件,剩下的唯一问题是当用户单击 URL 时如何规避您想要为触摸执行的任何操作。

这可以通过一些花哨的 Handler 步法来实现,方法是发送延迟的触摸消息,然后如果触摸是由用户单击 URL 引起的,则删除这些触摸消息。

【讨论】:

猜你喜欢
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多