2016-07-07 9 views
0

端末エミュレーションのキー入力を聞く必要があります。だから、私はEditTextを持っていない。しかし、私は成功し、ここでAndroidのソフトキーボードで入力キーを照会できない

public class Click implements View.OnClickListener 
    { 
    @Override 
    public void onClick (View view) 
     { 
     CursorText terminal = (CursorText) findViewById (R.id.term_window); 
     InputMethodManager manager; 
     manager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); 
     manager.showSoftInput (terminal, InputMethodManager.SHOW_FORCED); 
     } 
    } 

によって変数terminalをソフトキーボードを起動TextViewから派生したカスタムクラスCursorTextのインスタンスです。それはクリックを受け入れるように属性android:textIsSelectable="true"を持っています。さもなければそれはandroid:imeOptions="flagNoExtractUi|flagForceAscii"を持っています、しかしこれらはどんな有害な影響も持たないようです。

私の問題は今、キーストロークを受信して​​います。 APIドキュメントを調べると、信頼できる方法がないかのように見えます。関連するドキュメントの中に記述されているクラスとメソッドは、ハードウェアキーボードでしか機能しません。しかし、道があるはずです。

私はonKeyListener,onKeyPreImeなどで多くのアプローチを試みましたが、ほとんど反応しません。例えば、onKeyPreImeは、Viewから派生したクラスでオーバーライドする必要があります。私の場合は、明白な選択はクラスterminalのインスタンスです。 EditTextではなく、onKeyPreImeが呼び出されない理由が考えられます。同じ理由で私の場合はTextWatcherを使うことはできないと私は信じています。

今のところ、最高の結果は、アクティビティのonKeyDownを上書きしたものです。このメソッドは、Backspaceを含むほぼすべてのキーに対して呼び出されます。 1つの最も重要なキー、Enter(Return)キーです。私は他のリスナーメソッドが私の前に呼び出され、ハンドルしますが、Enterキーイベントを渡していないと感じています。私は見つけ出す方法を知らない。

私が持っているもう1つの問題onKeyDownは、キーを押したままでオートリピートを生成しないということです。 KeyEvent.ACTION_DOWNとしか報告されていないようですが、KeyEvent.ACTION_UPはありませんので、自分自身で自動リピートを作成することはできません。

私はオートリピートせずに生きることができたと思うが、Enterキーを持たないとショーストッパーになる。どうすればEnterキーイベントのロックを解除できますか? Enterキーを押したときにonKeyDownが呼び出されないようにするにはどうすればよいですか?あるいは、私はキーストロークを聞くという全く異なるやり方をとるべきでしょうか?

BTW。私はLollipopとKitkat、実際のハードウェア上のCMとエミュレータ上のVintage-Google-Androidの両方をテストしており、Jelly Bean以降をサポートしようとしています。

答えて

0

SOftキーボードは、ほとんどキーイベントを作成しません。通常、一度に文字列全体を取得するinputConnection.commitTextを呼び出して動作します。必要な処理を行うには、InputMethodをビューに結びつけ、ビューのonCreateInputConnectionをオーバーライドして、commitTextを適切に処理できるカスタムInputConnectionを返す必要があります。

関連する問題