24

アプリケーションで検索ボックスとして機能する編集テキストがあります。Nexus7のJellyBeanで、リッスンしているテキストボックスに何かを入力して押すと、KeyEvent=nullおよびActionId=0がonEditorAction()メソッドに渡されます。他の誰かがこれに遭遇しましたか?バグかもしれないと思っています。

以下の2番目のifステートメントでは、actionId=0およびKeyEvent=nullであるため、nullポインターを取得します。

// Search field logic.
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    Log.d(TAG, "onEditorAction");
    if (event != null && event.getAction() != KeyEvent.ACTION_DOWN)
        return false;
    if (actionId == EditorInfo.IME_ACTION_SEARCH
            || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
              .....Do some stuff();
     }
}
4

6 に答える 6

43

KeyEventのnullチェックを追加することになりました。これが3.0以降で発生することを指摘してくれたcommonswareに感謝します。解決策というよりは回避策のように見えますが、機能します。

// Search field logic.
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    Log.d(TAG, "onEditorAction");
    if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) {
        return false;
    } else if (actionId == EditorInfo.IME_ACTION_SEARCH
        || event == null
        || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
              .....Do some stuff();
    }
}
于 2012-07-04T14:56:38.780 に答える
7

私の「虫のような振る舞い」は、imeActionLabel物事を複雑にすることによるものであることがわかりました。カスタムリターンキーラベルを作成する方法としてテキストフィールドガイドに記載されているため、これを使用しただけです。これがロリポップでの私のテストの結果です、

ケース1:デフォルト、リターンキーシンボル=閉じ角かっこ

<EditText
    android:singleLine="true"
    android:inputType="textUri"/>

onEditorActionは1回呼び出されます。

  • KeyEvent = null、actionId = 5 =EditorInfo.IME_ACTION_NEXT
    • trueを返すと、カーソルはEditTextのままになり、キーボードが開きます
    • falseを返すと、カーソルは次のフォーカス可能な位置に移動し、必要に応じてキーボードを開きます

ケース2 imeOptions:、リターンキーシンボル=チェックマーク

<EditText
    android:singleLine="true"
    android:inputType="textUri"
    android:imeOptions="actionDone"/>

onEditorActionは1回呼び出されます。

  • KeyEvent = null、actionId = 6 =EditorInfo.IME_ACTION_DONE
    • trueを返すと、カーソルはEditTextのままになり、キーボードが開きます
    • falseを返すと、カーソルはEditTextに残り、キーボードは閉じます

ケース3 imeActionLabel:、リターンキーシンボル="URdone"

<EditText
    android:singleLine="true"
    android:inputType="textUri"
    android:imeOptions="actionDone"
    android:imeActionLabel="URdone"/>

onEditorActionは複数回呼び出すことができます。

  • KeyEvent = null、actionId = 0

    • trueを返すと、カーソルはEditTextに留まり、キーボードが開いたままになり、onEditorActionは2回呼び出されません。
    • falseを返す場合、onEditorActionは2番目の時間と呼ばれます。
  • KeyEvent = KeyEvent.ACTION_DOWN、actionId = 0

    • falseを返すと、カーソルは次のフォーカス可能な場所に移動し、必要に応じてキーボードを開きます。onEditorActionは3回呼び出されません。
    • trueを返す場合、onEditorActionは3回目と呼ばれます。
  • KeyEvent = KeyEvent.ACTION_UP、actionId = 0

    • trueを返すと、カーソルはEditTextのままになり、キーボードが開きます
    • falseを返すと、カーソルは次のフォーカス可能な位置に移動し、必要に応じてキーボードを開きます

ノート:

actionId=0がfromEditorInfo.IME_ACTION_UNSPECIFIEDまたは。かどうかはわかりませんEditorInfo.IME_NULL

次のフォーカス可能オブジェクトが編集不可の場合、リターンキー記号は左向きの矢印になります。

setOnFocusChangeListenerをオーバーライドするために使用することもできますonFocusChange。これは、上記のカーソルの動作に従って呼び出されます。

于 2016-04-20T19:29:03.277 に答える
3

それに加えKeyEvent.ACTION_UPて、キャプチャする必要もありKeyEvent.ACTION_DOWNます。KeyEvent.ACTION_UP渡されない限りEditText、私たちは機能しonEditorActionません。例:

@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    final boolean isEnterEvent = event != null
            && event.getKeyCode() == KeyEvent.KEYCODE_ENTER;
    final boolean isEnterUpEvent = isEnterEvent && event.getAction() == KeyEvent.ACTION_UP;
    final boolean isEnterDownEvent = isEnterEvent && event.getAction() == KeyEvent.ACTION_DOWN;

    if (actionId == EditorInfo.IME_ACTION_DONE || isEnterUpEvent ) {
        // Do your action here
        performLogin();
        return true;
    } else if (isEnterDownEvent) {
        // Capture this event to receive ACTION_UP
        return true;
    } else {
        // We do not care on other actions
        return false;
    }
}

に従ってEditorInfo.IME_ACTION_DONEの正しいバージョンに交換する必要がありますEditorInfo.IME_ACTION_android:imeOptions="actionNext"

于 2014-07-15T18:11:58.007 に答える
2

[Enter]をクリックすると、複数のイベントを取得できることに注意してください(Androidのバージョンによって異なります)。1つはKeyDown(KeyEvent.ACTION_DOWN)用、もう1つはKeyUp(KeyEvent.ACTION_UP)用です。同じアクションに対して誤って2つのサーバー呼び出しを開始したことを確認するのを忘れたとき。

searchBox.setOnEditorActionListener(new OnEditorActionListener() {
// enter key in search box triggers search
@Override
public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event) {
    if ((event != null && event.getAction() == KeyEvent.ACTION_UP) || event==null) {
        onSearchButtonClicked();
    }
    return true;
}
});
于 2012-09-30T11:05:12.680 に答える
1

リターンキーをカスタマイズした場合、真実を発見することはできません。レイアウトにimeActionLabelimeActionIdの両方を設定する必要があります。そのような:

imeActionLabel="xxxx"
imeActionId = "6"

Javaコードの場合:

@Override
public boolean onEditorAction(TextView v, int actionId,  KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
     doSomeThing();
     return true;
   }

    return false;
}

それはうまくいくでしょう。

于 2018-03-23T10:27:01.360 に答える
0

すべてのenterイベントのアクションIDは、デフォルトで0に設定されています。

Androidのドキュメントから:

actionId int:アクションの識別子。これは、指定した識別子、またはEnterキーが押されたために呼び出された場合はEditorInfo#IME_NULLのいずれかになります。

したがって、Enterキーイベントを処理する適切な方法は次のようになります。

@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_NULL) {
        // Handle return key here
        return true;
    }
    return false;
}
于 2020-03-13T14:47:08.240 に答える