2010-11-26 10 views
21

このコードが動作しない理由を理解できません。バックスペースとリターンキーだけが検出されます。リスナーは他のキーでは起動しません。私のデバイスはNexus Oneです。onKeyListenerが仮想キーボードで動作しない

アクティビティのOnKeyDownメソッドをオーバーライドしようとしましたが、それはさらに悪いことです。検出された唯一のボタンはハードウェア戻るボタンでした。

私はTextWatcherとonTextChangedを使用することを提案していますが、それは実際にはうまくいかない場合もあります。たとえば、テキストボックスが空の場合、ユーザーがBackSpace(Delete)ボタンを押しても検出されません。 これはどんなアイデアですか?

 TextView txtInput = (TextView)findViewById(R.id.txtInput); 
    txtInput.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      makeToast(keyCode + " key pressed"); 
      return true; 
     } 
    }); 
+0

この問題では4時間を過ごしました。これは誰にも解決策がないようです。 OnKeyboardActionListenerの使用を提案している人はほとんどいませんが、使用方法の例は見つかりません。 – bobetko

+0

ここに見つかった例:http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.html – bobetko

+0

ソフトキーボードの例が私にとってうまくいくかどうかはわかりません。私は別の入力方法を書いてはいけません。私は単に画面(デフォルトではアンドロイドキーボード)にデフォルトの入力方法を表示し、キーを押したままにします。なぜこれは大変な仕事なのでしょうか?私はイライラしている。 – bobetko

答えて

18

[OK]を返却することにより、処理することを可能にします。私は最終的に私が欲しいものをする方法を考え出しました、そして、私はこれについてAndroidに誇りを持っていません。

私はクライアントでSoftKeyboardを開いて、押されたキー(文字とDELキー)を送信する必要があるサーバー/クライアントアプリケーションを書いています...キーを押すたびに、その文字がサーバーに送られます。 DELが押された場合、私はシーケンス{BS}をサーバーに送ります。

これを行うには、EditTextが空で、ユーザーがDELキーを押したときの状況を除いて、うまく動作するTextWatcherとonTextChangeを実装しなければなりませんでした。 EditTextに変更がないので、DELキーが押されたことを検出する方法はありません。

TextWatcherに加えて、私はEditTextコントロールにアタッチしたonKeyListenerを実装しなければなりませんでした。このonKeyListenerは、DELおよびRETURNを除くSoftKeyboard上のすべてのキーを無視します。理由は分かりませんか?多分バグでしょうか?ここで

私のコードです:

TextView txtInput = (TextView)findViewById(R.id.txtInput); 
    txtInput.addTextChangedListener(inputTextWatcher); 

    txtInput.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      Log.d(TAG, keyCode + " character(code) to send"); 
      return false; 
     } 
    }); 

とTextWatcher ....

private TextWatcher inputTextWatcher = new TextWatcher() { 
    public void afterTextChanged(Editable s) { } 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) 
     { } 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     Log.d(TAG, s.charAt(count-1) + " character to send");;   
    } 
}; 
+0

キーボードの中にはonkeyupキーコード(S3/S4のsamsungデフォルトキーボードなど)を送信していないものがあります。代わりにテキストを見て回って回避する必要があります... – kenyee

+1

文字がなく、ユーザーがバックキーを押すとどうなりますか? – Arslan

4

あなたはここで間違いを犯しました。
あなたがイベントを処理した場合は、return trueする必要があります。あなたがにしたい場合は、イベントが次の受信機return false
あなたは常に真

+0

それを明確にしていただきありがとうございます。私は実際に偽も返そうとしました。私はonKeyboardActionListenerを使用しなければならないと思いました。明日はそれに時間を費やすだろう。どうも。 – bobetko

0

我々としてもiPhone上TextWatcherの問題を抱えていた - バッファが空の場合、キーボードはデルを送信しませんイベント。私たちは1000文字でキーボードバッファをプリロードすることでその問題を解決しました。幸いにも、私たちのアプリは1000文字が見えないようにキーボードの後ろに編集フィールドを隠しました。それは醜いですが、(ユーザーがデータを入力する前に行の中で1000の削除をヒットしない限り)

2

そのビューに特定のリスナーサブクラスを使用しようとしましたか?

私はEditTextで同様の問題がありました。

private OnKeyListener keyListener = new EditText.OnKeyListener(){ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     EditText et = (EditText) v; 
     Log.i("APPEVENT", "Key hit: "+ event); 
     //... 
     return false; 
    } 

}; 

をしかし、私はView.OnKeyListener、私だけのレコードバックスペースを使用して入力した場合:以下のコードでは、働いていました。 TextViewで同様の問題が発生する可能性があります。おそらく、サブクラスのキーリスナーは、指定されたViewサブクラスのより多くのイベントに対して敏感です。

3

注:あなたのedittextにinputtypeの言及。

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:inputType="textCapSentences|textAutoCorrect" > 



edittext.setOnEditorActionListener(new OnEditorActionListener() { 

      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

       if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) { 
        //do something here. 
        return true; 
       } 
       return false; 
      } 
     }); 
+0

これはMimuumのキーボードで私の問題を解決しました。それはあなたのコードのようにimeOptionsなしで動作しますか? – Goufalite

関連する問題