24

私たちは最初の Android アプリに取り組んでおり、これまでのところ非常に楽しい経験になっています。これはほぼ完成していますが、リリース前に、主に Android ソフト キーボードに関していくつかの考慮事項があります。

数値の入力に使用するEditTextフィールドがいくつかあり ます。ユーザーが Enter キーを押したときにイベントをキャプチャし、このコールバックで計算と保存を行います。

問題は、電話機ごとにキーボードが異なるため、固定イベントを取得できないことです。一部には「完了」ボタンがあり、HTC フォンには「Enter」ボタンがあります。imeOptions を「done」として使用してみましたが、HTC 電話には影響しませんでした。

また、戻るボタンを押すことでキーボードを閉じることができることもわかっています。したがって、私の質問は、ユーザーが入力を停止したとき、またはキーボードが非表示になったときを知る信頼できる方法があるどうかです.下)..

つまり、Android 開発者はソフト キーボードをどのように扱うのでしょうか。editText onClick()イベントでKeyEvent.KEYCODE_ENTERを確認し、そこでタスクを実行します。HTC Android では動作しますが、入力の代わりに完了ボタンがある友人の Nexus 電話では動作しません。onClick も呼び出されません。開発者はこれをどのように処理しますか?

編集:私の髪の半分を失った後、そしてここにいる何人かの良い友達の助けを借りて

私はあなたの提案をすべて試しましたが、最後にonEditorActionListener と onKeyListenerメソッドを使用することでうまくいきました。onEditorActionListenerの onEdit コールバックで、キーコード ACTION_DONE をチェックしました。これは、キーボードの完了ボタンで呼び出されました。enter onKey を持つキーボードでは呼び出されます。onKey メソッドでは、ハードウェアのバック プレス イベントも処理できるように、KEYCODE_BACK もチェックしました。完了してキーボードで入力するAndroidデバイスをまだ見つけていません(真剣に)、それでもフラグを使用してそのケースを処理しました。onEditorActionListener を提案してくれた @Femi に感謝します。また、助けてくれたすべての友人に感謝します。しかし、私の元の質問への答え

Q: Android のソフト キーボードが終了したことを確認する信頼できる簡単な方法はありますか (すべての電話で機能するコールバック)。

回答 :いいえ、ここで提案されているすべての方法と、他のサイトで提案されているすべての方法は簡単ではありません。また、キーボードのリターン キーのイベントを処理することは、どのオペレーティング システムでも最も基本的なことだと思います。グーグル、そこにいますか?

4

7 に答える 7

7

KEYCODE_ENTERイベントをキャッチしているように見えるので、これを使用できるかもしれません: http://developer.android.com/reference/android/widget/TextView.html#setOnEditorActionListener%28android.widget.TextView.OnEditorActionListener%29 . 理論的には、これにより、入力メソッドの終了アクションが何であれ (バック、完了、入力など) を検出し、それに応答することができます。

それがうまくいくかどうか教えてください。

于 2011-05-09T05:59:29.657 に答える
2

ユーザーがハードウェア キーボードで TextView を離れるときにも、これらの計算を実行する必要はありませんか? キーボードではなく、TextView 自体に注目します。もしそうなら、おそらくあなたが望むのはsetTransformationMethodです

カスタムTransformationMethod、特にソース CharSequence を別のものに変換するメソッド getTransformation を実装する必要があります。次に、onFocusChanged を使用して、その TextView のフォーカスが失われた場合にのみこれを適用できます。

于 2011-05-23T18:43:58.423 に答える
1

dispatchKeyEventPreImeをオーバーライドするカスタムEditTextビューを実装しようとしましたか?Arnaudによって投稿された回答(ソフトキーボードからインターセプトの戻るボタンを参照)と同じですが、カスタムレイアウトを使用する代わりに、カスタムEditTextを使用してオーバーライドします。

@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
    if(KeyEvent.KEYCODE_BACK == event.getKeyCode()) {
       //this hides soft keyboard in super.dispatchKeyEventPreIme(event)
    }
    return super.dispatchKeyEventPreIme(event);
}

私はこの質問でこの解決策を提案しました

于 2011-05-23T12:00:28.863 に答える
1

この場合、Google がキーボードに依存しないコールバックを持っていないとは信じられません

うわー、どちらも信じられない。現在、同様の問題が発生しています。IME ACTION に加えて、EditField のフォーカスの変更をチェックします。これはほとんどの場合問題ありませんが、常に機能するとは限りません。

キーボードが非表示になったときに通知を受ける方法を見つけましたが、まだ完全な解決策ではありません (そして、それが良いアイデアかどうかはわかりません) が、今は続行する時間がないので、ここでアイデアの始まりをドロップできると思いました...:

独自の EditText を作成し (EditText を拡張)、オーバーライドしますonCreateInputConnectiononCreateInputConnection独自の実装を返します(InputConnection単純に BasicInputConnection を拡張できます。InputConnections の「finishComposingText()」メソッドは、キーボードが非表示になっているとき (ユーザーが戻るキーを押したときも) 常に呼び出されます)。

これはコードであり、入力したテキストがこの編集フィールドに表示されない理由を他の誰かが考えているかもしれません;-)

public class MyEditText extends EditText{

public MyEditText(Context context) {
    super(context);
}

public MyEditText(Context context, AttributeSet attrs) {
    super(context);
}

public MyEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    System.out.println("onCreateInputConnection, "+outAttrs.actionId);
    return new MyInputConnection(this,true);
}

private class MyInputConnection extends BaseInputConnection{

    public MyInputConnection(View targetView, boolean fullEditor) {
        super(targetView, fullEditor);
    }

    @Override
    public boolean finishComposingText() {
        System.out.println("FINISH");
        return super.finishComposingText();
    }   
}
 }

JPM

于 2011-05-18T22:05:30.053 に答える
1

このSOページで解決策を見つけました: ソフトキーボードから戻るボタンをインターセプト

mhradek からの回答は 0 票ですが、機能しているようです。

アイデアは、アクティビティの基本レイアウトを拡張して、dispatchKeyEventPreIme メソッドをオーバーライドし、渡された KeyEvent に関して必要なことを実行できるようにすることです。ソフト キーボードの管理はユーザーの責任であることに注意してください。

私はそれを使用しており、ソフトキーボードがそれらを「食べる」ことなく、キーストローク(たとえば、戻るボタン)を確実に傍受できます。何が可能で何が不可能かを確認するために、私はまだそれをもっと試してみる必要があります.

お役に立てば幸いです。

于 2011-05-21T22:40:13.960 に答える
0

私はこれを試していませんが、ドキュメントを読むと、それは可能のようです。

//    From an activity, you can call

if (getResources().getConfiguration().keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) {
// your code here
}
于 2011-07-08T09:32:52.170 に答える
0

このコードは、HTC とデフォルトの Android キーボードでうまく機能しています。

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                // handle enter key on keyboard
                if (actionId == EditorInfo.IME_ACTION_SEND || 
                        (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) {
                    if (uid != null) {
                        // hide keyboard
                        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                        // perform other stuff

                        return true;
                    }
                }
                return false;
            }
        });

editText の XML で以下を使用します。

android:imeOptions="actionSend"

もちろん、send のような別のものを使用することもできますが、XML と Java コードの両方で必ず変更してください。

于 2011-10-12T14:43:10.817 に答える