2013-02-04 58 views
0

我一直在尋找一個這樣的工作示例,並且沒有找到任何實際可行的方法。隱藏或禁用WebView軟鍵盤開始/完成/輸入按鈕

我有一個簡單的在線反饋表單,我使用WebView安裝在Android設備上,專門用於Nexus 7(它只會在我們酒店的這些設備上使用)。

問題是,html反饋表單具有不同的字段集,其中一些單選按鈕與文本字段和文本區域。該表格是通過郵寄方式發送,我有打電話的形式jQuery驗證腳本:

<form name="form" method="post" action="feedback_manager/fb_save.php" onsubmit="return validateForm()" > 

一切都運行得很好,除非用戶在文本字段中填入了有一個明確無誤的藍色「開始」按鈕,在軟鍵盤,他們必須在完成鍵入後點擊(或觸摸),問題是它不會將它們帶到下一個表單字段集,而是自動提交表單(或者在這種情況下運行我的驗證腳本第一)。

是不是KEYCODE_ENTER按鈕的默認操作應該將用戶發送到下一個字段集而不是提交表單?

我會分享我的HTML表單和希望我的web視圖腳本,有人可能會覺得我做錯了什麼:

<fieldset> 
<legend>Food quality, taste &amp; presentation</legend> 

    <input id="flavor4" name="flavor" value="excellent" type="radio" /> 
    <label for="flavor4"> Excellent</label><br> 

    <input id="flavor3" name="flavor" value="good" type="radio" /> 
    <label for="flavor3"> Good</label><br> 

    <input id="flavor2" name="flavor" value="average" type="radio" /> 
    <label for="flavor2"> Average</label><br> 

    <input id="flavor1" name="flavor" value="bad" type="radio" /> 
    <label for="flavor1"> Needs improvement</label><br> 

</fieldset> 
<fieldset> 
    <legend>Who was your waiter today?</legend> 
    <input name="waiter" type="text"> 
</fieldset> 

//then another fieldset with radio buttons and so on 

難道說我的文字輸入是不是一前一後,立即向右並與單選按鈕和組合框混合?

這裏是我的onkeydown代碼:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) 
    { 
     mWebView.goBack(); 
     return true; 
    } 
    if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) { 
     // do nothing 
     return false; 
    } 
    return true; 
} 

關於這個有趣的是,我的KEYCODE_BACK條件是工作正常,但我想KEYCODE_ENTER按鈕,要麼什麼也不做,只是關閉軟鍵盤或去下一個字段但不提交表格。

我在這裏看到很多答案,但他們沒有一個似乎在Nexus7上工作(在其他設備上沒有真正嘗試過)。因此,總結起來,我所需要的只是藍色的「Go」按鈕什麼也不做,或者去下一個領域。

請幫忙。

** 編輯 **

今天早上我在看這一個別開生面,發現這個類似的帖子,增加了一個OnKeyListener檢測鍵,然後返回false。 Enter key on EditText hitting onKey twice

mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.loadUrl("http://some.url"); 
    mWebView.setWebViewClient(new virtuoWebViewClient()); 

    mWebView.setOnKeyListener(new View.OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (event.getAction() == KeyEvent.ACTION_DOWN) { 
       if (keyCode == KeyEvent.KEYCODE_ENTER) { 
        // do nothing 
        return false; 
       } 
      } 
      return false; 
     } 
    }); 

,但仍然沒有,「轉到」按鈕仍然提交表單:(,我會繼續努力,如果有人可以點我在一個不同的方向或分享新的想法,我將不勝感激。Thx。

回答

1

好的我必須讓這個煨,因爲它有一點挫敗感,經過大量的試驗和錯誤,似乎WebView本身不會允許我沒有EditText的行爲。我真的不需要這個應用程序的EditText,我發現輸入類型文本顯示「Go」按鈕,但textareas沒有,他們用一個返回托架按鈕替換它(這不是藍色,不發送表單),它既便宜又粗糙,但符合目的,所以我基本上最終使用了textareas,其參數rows =「1」,因此它看起來像一個輸入類型文本。

<textarea rows="1" name="waiter"></textarea> 

隱藏「Go」,「Done」或「Enter」按鈕XD的極低技術解決方案。

2

我花了很長時間尋找解決方案,但沒有什麼是完美的。這是我能找到的最佳解決方法,除非焦點在文本區域或提交按鈕上,否則它會用「選項卡」操作取代「返回」(提交)操作:

$("form").keydown(function(e){ 
    if (e.which != 13) return; // ENTER 
    if (e.target.type == "textarea" || e.target.type == "button") return; 
    if ($("input[type=submit]", this).length == 1) return; // autosubmit form 

    var nextTabbable = null; 
    var $tr = $(e.target).closest("tr, form"); 
    var narrowContext = $tr.length && e.target.tabIndex == undefined && !$tr.is("form"); 
    if (narrowContext) nextTabbable = getNextTabbable($tr.add($tr.next()), e.target); 
    if (!nextTabbable) nextTabbable = getNextTabbable(this, e.target); 

    if (nextTabbable) { 
     if (nextTabbable.type == "text" && nextTabbable.value != "") nextTabbable.select(); 
      nextTabbable.focus(); 
     return false; 
    } 
}); 

function getNextTabbable(ctx, current) { 
    var $t = $("input[tabindex!=-1]:visible, select[tabindex!=-1]:visible, textarea[tabindex!=-1]:visible", ctx).not(":disabled"); 
    var docIndex = {}; 
    $t.each(function(i,e){ docIndex[e] = i }); 
    $sorted = $t.sort(function(a,b){ return a.tabIndex==b.tabIndex ? docIndex[a]<docIndex[b] : a.tabIndex<b.tabIndex ? -1 : 1 }); 
    return $sorted.get($sorted.index(current)+1); 
}