2012-07-02 4 views
23

私のアプリケーションでは、検索ボックスとして機能する編集テキストがあります。 Nexus 7のJelly Beanで、私が聴いているテキストボックスに何かを入力して打鍵すると、KeyEvent = nullが入力され、onIditorAction()メソッドにActionId = 0が渡されます。他に誰かがこれに遭遇しましたか?私はバグかもしれないと思っています。onEditorAction()(Jelly Bean/Nexus 7)のkeyeventとactionid = 0 null

以下の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(); 
    } 
} 
+0

ではなくedittext' 'の'アンドロイド-edittext'タグを使用してください:) –

+3

'event'は、少なくともハニカムに戻って間違いなく、時には' null'なので、です。ここで私は 'onEditorActionを()'を使用する方法を示すサンプルプロジェクトは、次のとおりです。https://github.com/commonsguy/cw-omnibus/tree/master/ActionBar/ActionBarDemo – CommonsWare

+0

@CommonsWare私はあなたの例を試してみました: –

答えて

38

nullイベントKeyEventの追加を終了しました。これを指摘するためのcommonswareのおかげで、これは3.0+で起こります。解決策の回避策のように思えますが、うまくいきます。

// 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(); 
    } 
} 
+6

。 TextView、%の20int、%20android.view.KeyEvent))**、 'actionId'が** [EditorInfo.IME_NULL(http://developer.android.com/intl/es/reference/android/view/inputmethodであってもよいです/EditorInfo.html#IME_NULL)* *は、Enterキーが押されたことを意味します*。 –

+0

恐ろしい!ありがとう。異なる質問の複数のソリューションのうち、Android Mの場合でも、これは非常にうまくいきました。 –

+1

実際、EditorInfo.IME_ACTION_DONEは少なくともAndroid 4.4.2のEnter/Doneキーです。 – FractalBob

1

Enterをクリックすると複数のイベントが発生することがあります(アンドロイドのバージョンによって異なります)。 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; 
} 
}); 
+0

これはどの理由があるのだろうか。私にとってはこれは本当に面倒です。エンターボタンはエンターイベントを表しており、これはヒューマンインタフェースを備えた各コンピュータのようなデバイス上で最も古く、最も重要なキーの1つです。なぜAndroid 3.0以降に失われたのかこの問題が発生したので、EditorInfo.IME_ACTION_DONEの何が問題なのかを知りたいと思います。 – icbytes

3

KeyEvent.ACTION_UPの横に、我々はまた、KeyEvent.ACTION_DOWNをキャプチャする必要があります。 KeyEvent.ACTION_UPEditTextに渡されない限り、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; 
    } 
} 

は、あなたは私が私の「バグのような挙動は」imeActionLabel複雑なものが原因であることがわかったandroid:imeOptions="actionNext"

4

に応じ​​のバージョンを修正するためにEditorInfo.IME_ACTION_DONEを交換する必要があります。カスタムリターンキーラベルを持つ方法としてText Fields Guideに記載されているので、私はそれを使用しました。デフォルト、戻るキーシンボル=終値角括弧

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

onEditorActionが一度呼び出されます。ここではロリポップでの私のテストの結果、

ケース1です。

  • たKeyEvent =ヌル、たAction = 5 = EditorInfo.IME_ACTION_NEXT
    • 真リターンは、カーソルがのEditTextでが残っている場合、オープンキーボード
    • 戻りfalseの場合、フォーカス可能な次にカーソル移動、キーボード開けばの場合 必要

ケース2:imeOptionsは、キーシンボルを返す= onEditorAction

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

チェックマークが一度呼び出されます。

  • たKeyEvent =ヌル、たAction = 6 = EditorInfo.IME_ACTION_DONE
    • falseを返す場合、カーソル
    • キーボードが開いて、のEditTextでままリターンtrueの場合、カーソルは、キーボード、のEditTextでまま閉じる

ケース3:imeActionLabelは、= "URdone"

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

onEditorActionが複数回呼び出すことができるキーのシンボルを返します。

  • のKeyEvent = nullを、たAction = 0

    • trueが返されて、カーソルはのEditTextでのままであれば、キーボードオープン、onEditorActionが二度目
    • falseを返した場合に呼び出されていません、 onEditorActionは、第2の時間と呼ばれます。
  • KeyEvent = KeyEvent.ACTION_DOWN、たAction = 0

    • リターンtrueの場合、onEditorAction第3時間と呼ばれ、必要に応じて、onEditorActionが
    • 第三の時間と呼ばれていない次のフォーカス可能、キーボードオープンに偽、カーソル移動を返す場合:
  • たKeyEvent = KeyEvent.ACTION_UP、たAction = 0

      falseを返す場合
    • リターンtrueの場合、カーソルが必要

NOTES場合次のフォーカス可能、キーボードオープンにカーソル移動し、、のEditTextに

  • オープンキーボードのまま:

    actionId = 0がEditorInfo.IME_ACTION_UNSPECIFIEDまたはEditorInfo.IME_NULLの場合はわかりません。

    次のフォーカス可能なものが編集不可能な場合、戻るキーシンボルは左向きの矢印になります。

    setOnFocusChangeListenerを使用して、onFocusChangeを上書きすることもできます。これは上記のカーソル動作に従って呼び出されます。

  • 関連する問題