3

Android のライブラリを使用して端末エミュレータに接続しています。これはシリアル デバイス (スイッチ) に接続し、送受信データを表示します。端末の下のテキスト ボックスを介して接続を介してデータを送信するか、どちらの場合も端末自体に入力してキーボードの Enter キーを押します。使用されるのはソフトキーボードだけです。間違った文字列を送信すると、回復不能な状態になるため、削除キーの実装を提供する必要がありました。

端末を選択すると、データを削除できます。ただし、editText を選択すると問題が発生します。削除を押すと、1 文字が削除されますが、端末では 2 文字がオンになっているように見えます。したがって、「enable」と書いて削除を押すと、端末画面では「enab」に変わりますが、実際に送信されるのは「enabl」です。だから私がする必要があるのは、いつ editText がフォーカスされているかを把握し、フォーカスされている場合はこれらの行を実行しないことです

  mSession.appendToEmulator(cmdLeft, 0, cmdLeft.length);
  mSession.appendToEmulator(cmdErase, 0, cmdErase.length);

これを組み込みました:http://developer.android.com/reference/android/view/View.OnFocusChangeListener.html

唯一の問題は、フォーカスを editText からターミナルに変更すると、時々文字が削除されることです。削除キーが押されるのを実際に待つ必要があります。常に発生するわけではありませんが、キーコードが削除されていると常に考えられ、フォーカスを切り替えるたびに削除が発生する状態でスタックしているようです。実行後にキーコードをリセットする必要がありますか?キーコードが削除だと思って動けなくなるのはなぜですか? Enterキーなどを押した後でも。editTextで削除を押したときに発生し、空です。editText が空で、ターミナルにデータがある場合、そのデータは正しく削除されますが、このバグが発生します。また、editText に何もなく、ターミナルにも何もない場合、何も削除されませんが、バグがトリガーされます。

public boolean dispatchKeyEvent(KeyEvent event) {
    if (event != null && event.getAction() == KeyEvent.ACTION_UP) {

        return false;
    }
if(event.getKeyCode() == KeyEvent.KEYCODE_DEL){

    mEntry.setOnFocusChangeListener(new OnFocusChangeListener(){
        @Override
        public void onFocusChange(View v,boolean hasFocus){

              if (!hasFocus) {
                    mSession.appendToEmulator(cmdLeft, 0, cmdLeft.length);
                    mSession.appendToEmulator(cmdErase, 0, cmdErase.length);
                    Log.d(TAG, "in inner delete");
              }
        }          
    });

    Log.d(TAG, "in delete in delete in delete in delete");
    try {
        sendOverSerial("\b".getBytes("UTF-8"));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
    return super.dispatchKeyEvent(event);
};
4

3 に答える 3

1

この小さなハックはうまくいくようですが、なぜそれが起こっているのか/より良い解決策を知りたいです。

    public boolean dispatchKeyEvent(KeyEvent event) {
    if (event == null || event.getAction() == KeyEvent.ACTION_UP) {

        return false;
    }
   if(event.getKeyCode() == KeyEvent.KEYCODE_DEL){

    mEntry.setOnFocusChangeListener(new OnFocusChangeListener(){

        public void onFocusChange(View v,boolean hasFocus){

              if (!hasFocus && !mEntry.getText().toString().trim().equals("")) {

                    mSession.appendToEmulator(cmdLeft, 0, cmdLeft.length);
                    mSession.appendToEmulator(cmdErase, 0, cmdErase.length);

              }
              else 
              {
                    mEntry.setText(" ");
              }
        }          
    });

    try {
        sendOverSerial("\b".getBytes("UTF-8"));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

    return super.dispatchKeyEvent(event);
};
于 2013-01-24T14:50:54.170 に答える
0

まず、 が(最初に押されたとき) と(ボタンが離されたとき) のdispatchKeyEvent2 回トリガーされるため、2 文字が削除されます。KeyEvent.ACTION_DOWNKeyEvent.ACTION_UP

したがって、次のチェックも実行する必要がありますACTION_UP

if( event.getKeyCode() == KeyEvent.KEYCODE_DEL 
    && KeyEvent.getAction()==KeyEvent.ACTION_UP )

これがあなたの問題の原因です。タイトルの質問に答えるには、次のEditTextようにフォーカスがあるかどうかを確認できますmyEditText.hasFocus()

于 2013-01-24T12:54:26.393 に答える