在 Android 中使用 butterknife 在 OnEditorAction 中引用空对象
Null object reference in OnEditorAction using butterknife in Android
我正在尝试将 ButterKnife 的接口 OnEditorAction 用于 EditText
的 "ENTER" 事件
@OnEditorAction(R.id.et_good)
boolean onEditorAction(EditText editText, int actionId, KeyEvent keyEvent) {
if (keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {
updateArticle(editText.getText().toString().toUpperCase().trim());
}
return keyEvent.getAction() == KeyEvent.KEYCODE_ENTER;
}
但是我不断收到异常
com.xxx.xxx E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xxx.xxx, PID: 6391
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.KeyEvent.getAction()' on a null object reference
at com.xxx.xxx.MainActivity.onEditorAction(MainActivity.java:68)
at com.xxx.xxx.MainActivity_ViewBinding.onEditorAction(MainActivity_ViewBinding.java:47)
at android.widget.TextView.onEditorAction(TextView.java:5911)
at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:360)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
布局xml文件供您参考。
<EditText
android:id="@+id/et_good"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="8dp"
android:paddingStart="10dp"
android:singleLine="true"
android:imeOptions="actionDone"
app:layout_constraintEnd_toStartOf="@+id/xxx"
app:layout_constraintStart_toEndOf="@+id/xxx"
app:layout_constraintTop_toBottomOf="@+id/xxx" />
请指教我错过了什么。
根据 API 参考文档 here,如果事件不是 Enter 键事件,则 keyEvent 对象将为 null。它可以是 EditText 上的任何其他事件(例如:您的案例中的焦点事件。)
试试这个,因为您在 xml 中定义了 android:imeOptions="actionDone"
,这应该可以。
@OnEditorAction(R.id.et_good)
boolean onEditorAction(EditText editText, int actionId, KeyEvent keyEvent) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
updateArticle(editText.getText().toString().toUpperCase().trim());
}
return actionId == EditorInfo.IME_ACTION_DONE;
}
我正在尝试将 ButterKnife 的接口 OnEditorAction 用于 EditText
的 "ENTER" 事件@OnEditorAction(R.id.et_good)
boolean onEditorAction(EditText editText, int actionId, KeyEvent keyEvent) {
if (keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {
updateArticle(editText.getText().toString().toUpperCase().trim());
}
return keyEvent.getAction() == KeyEvent.KEYCODE_ENTER;
}
但是我不断收到异常
com.xxx.xxx E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xxx.xxx, PID: 6391
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.KeyEvent.getAction()' on a null object reference
at com.xxx.xxx.MainActivity.onEditorAction(MainActivity.java:68)
at com.xxx.xxx.MainActivity_ViewBinding.onEditorAction(MainActivity_ViewBinding.java:47)
at android.widget.TextView.onEditorAction(TextView.java:5911)
at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:360)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
布局xml文件供您参考。
<EditText
android:id="@+id/et_good"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="8dp"
android:paddingStart="10dp"
android:singleLine="true"
android:imeOptions="actionDone"
app:layout_constraintEnd_toStartOf="@+id/xxx"
app:layout_constraintStart_toEndOf="@+id/xxx"
app:layout_constraintTop_toBottomOf="@+id/xxx" />
请指教我错过了什么。
根据 API 参考文档 here,如果事件不是 Enter 键事件,则 keyEvent 对象将为 null。它可以是 EditText 上的任何其他事件(例如:您的案例中的焦点事件。)
试试这个,因为您在 xml 中定义了 android:imeOptions="actionDone"
,这应该可以。
@OnEditorAction(R.id.et_good)
boolean onEditorAction(EditText editText, int actionId, KeyEvent keyEvent) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
updateArticle(editText.getText().toString().toUpperCase().trim());
}
return actionId == EditorInfo.IME_ACTION_DONE;
}