WebViewの横のコントロールに←→キーで移動する

setNextFocusLeftId() が動いてくれなかったので、いろいろ試してこんな感じにした。

webView.setOnKeyListener(new OnKeyListener() {
  private String lastUrl;

  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_LEFT:
    case KeyEvent.KEYCODE_DPAD_RIGHT:
      HitTestResult hr = webView.getHitTestResult();
      if (event.getAction() == KeyEvent.ACTION_UP) {
        if (TextUtils.equals(lastUrl, hr.getExtra())) {
          webView2.requestFocus();
          return true;
        }
      lastUrl = hr.getExtra();
      break;
    }
    return false;
  }
});

キーの DOWN/MULTI/UP の度に getHitTestResult() でカーソルで選択されている url を取得。
キーが UP したときに、直前に取得した url と同じの場合、「それ以上カーソルが横に動かない」と見なしてwebView2にフォーカスを設定する。


あまりよくないけど、とりあえずok。
WebViewでページが短いのにスクロールバーが出る問題がまだ未解決...。頭痛い。

追記 2010-09-07

だめなパターン発見。
リンク先が同じリンクが2つ横に並んでいると、「直前に取得したurlと同じ」になってしまうのでだめですな。
確率はそんなに高くないけど、アキバ総研みたいなRSSだとダメだな。(画像なんかのリンクをすべて、元記事へのリンクにしてある)
素直にホスト側からスクリプトを入れて、DOMにアクセスすれば解決できるかな。JavaScriptを有効にする必要があるのが気に入らないけど。