16

私は、dispatchKeyEvent の次の行の問題をほとんど修正しました。

byte[] cmdLeft = { (byte) 27, (byte) '[', (byte) 'D' };
byte[] cmdErase = { (byte) 27, (byte) '[', (byte) 'P' };


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

唯一の問題は、editText を選択して [削除] をクリックすると、1 文字が削除されますが、2 文字が画面に表示されることです。したがって、enable と書いて delete を押すと、enab に変わりますが、実際に送信されるのは enabl です。

私はdispatchKeyEventをオーバーライドしましたが、うまくいきました。editText が選択されている場合、端末はシリアル経由で文字を削除するので、これは適切な手順です。ただし、端末自体が選択されている場合、文字を削除する代わりに奇妙な小さなボックスが画面に書き込まれるという主な問題は依然として存在します。1 つが書かれていて、削除を押し続けるとその 1 つのボックスにとどまりますが、次に入力すると、押した削除の量がボックスとして表示されます。それは非常に奇妙です...

端末ではなく、編集テキストに対してオーバーライドされているようです。

すべての栄光の奇妙な小さな箱:

ここに画像の説明を入力してください

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

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

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

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

現時点では、削除を押すと、少し奇妙なボックス文字が表示され、他に何も起こらず、ログに例外が発生することがあります ( http://i.imgur.com/wMRaLPX.png )。私が知りたいのは、削除キーの機能を変更して、それを押したときにこのような削除文字を送信できるようにするだけでなく、編集テキストボックスなどで文字を削除する機能を保持する方法です:

sendOverSerial("\b".getBytes("UTF-8"))

これは正しいバック スペースを送信します。組み込む必要があるだけです。

しかし、ソフトキーボードはキーの押下を登録していないようですか? 0 のキーコードを取得し続け、Enter のみが機能します。

私は現在https://stackoverflow.com/questions/4...62035_11377462を試していますが、これまでのところ約10の提案が機能していないため、他の提案は素晴らしいでしょう。私のバックスペースは editText ではなく、端末ビューに関連付けられます。削除キーが押されていることさえ検出できません。

4

4 に答える 4

4

使用しているターミナル コントロールは、ウィンドウに伝播させる代わりに KEYCODE_DEL を消費し、\b の代わりに別の文字をリモート エンドに送信する必要があるようです。したがって、編集テキストがフォーカスされている場合、dispatchKeyEvent はプレスを処理していますが、ターミナルにフォーカスがある場合は表示されません。端末にフォーカスがあるときに、デバッガー経由でイベント ハンドラーが起動していることを確認しましたか? 端末に使用しているライブラリはわかりませんでしたが、それを見て、キー ハンドラなどを設定できるかどうかを確認します。

于 2013-01-23T23:55:53.330 に答える
2

私は Android の経験がありません。また、delete/backspace キー バインドを実装しようとしたことがないことも認めます。ただし、これを行おうとしていて、適切な標準実装を知らなかった場合は、おそらく問題なく機能する回避策を考えることができます。関連付けられたアクション リスナーを使用して、削除するキー バインドを作成します。テキスト フィールドからアクション リスナー getText() を作成し、文字列として保存します。その文字列を部分文字列にして、最後の文字以外のすべてを含めます。次に、新しい文字列を含むテキスト フィールドに setText() を使用します。手動で行う方法ですが、間違いなく機能します。

于 2013-01-19T19:31:07.990 に答える
1

Sendチャット プログラムのように、ユーザーが を押したときに、文字列全体をキャプチャして一度に送信することをお勧めします。

于 2013-01-23T19:47:26.830 に答える
0

解決策は、画面に書き込むメソッドを別のクラスに移動することでした。その後、すべてが正常に機能しました。

于 2013-01-24T15:31:48.590 に答える