EditTextに何かを入力すると、アプリケーションがクラッシュし続けますが、これが常に発生するわけではありません。私のアプリは、Samsung Galaxy Tab 2 10.1 WiFI&3G(GT-P5100)でAndroid 4.0.4(ICS)で実行しています。標準のキーボードを使用しています。
これは私のlogcatです:
11-28 21:43:01.007: E/AndroidRuntime(15540): Java.lang.IllegalStateException: focus search returned a view that wasn't able to take focus!
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.widget.TextView.onKeyUp(TextView.Java:5833)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.KeyEvent.dispatch(KeyEvent.Java:2659)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.View.dispatchKeyEvent(View.Java:5547)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.ViewGroup.dispatchKeyEvent(ViewGroup.Java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.ViewGroup.dispatchKeyEvent(ViewGroup.Java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.ViewGroup.dispatchKeyEvent(ViewGroup.Java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.ViewGroup.dispatchKeyEvent(ViewGroup.Java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.ViewGroup.dispatchKeyEvent(ViewGroup.Java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.ViewGroup.dispatchKeyEvent(ViewGroup.Java:1246)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.Android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.Java:2027)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.Android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.Java:1388)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.app.Activity.dispatchKeyEvent(Activity.Java:2324)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.Android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.Java:1954)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.Java:3360)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.view.ViewRootImpl.handleMessage(ViewRootImpl.Java:2618)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.os.Handler.dispatchMessage(Handler.Java:99)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.os.Looper.loop(Looper.Java:137)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Android.app.ActivityThread.main(ActivityThread.Java:4514)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Java.lang.reflect.Method.invokeNative(Native Method)
11-28 21:43:01.007: E/AndroidRuntime(15540): at Java.lang.reflect.Method.invoke(Method.Java:511)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:790)
11-28 21:43:01.007: E/AndroidRuntime(15540): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:557)
11-28 21:43:01.007: E/AndroidRuntime(15540): at dalvik.system.NativeStart.main(Native Method)
これは私のEditTextsの1つです。
<EditText
Android:id="@+id/input_ftu_position_other"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginLeft="64dp"
Android:ems="20"
Android:inputType="text" />
私はこれと同じクラッシュを経験しており、正確な状況のように聞こえませんが、おそらくこれはまだ役立つでしょう:
EditTextボックスが2つありました。下の方は上の方のネクストフォーカスダウンでした。場合によっては、下のボックスを非表示にするため、上のボックスからキーボードを次に押すと、下のボックスに移動しようとしますが、非表示になっているためクラッシュします。下のボックス(別のEditTextのNext Down Focusのターゲット)をフォーカス不可に設定することで、これを修正しました。
EditText inputBox = (EditText)findViewById(R.id.Bottom_Box);
inputBox.setFocusable(false);
これがお役に立てば幸いです。
このエラーは、ImeOptionsがEditorInfo.IME_ACTION_NEXT
またはEditorInfo.IME_ACTION_PREVIOUS
に設定されている場合に発生します。そのビューの親はフォーカス可能ではありませんが、または次に見つかったフォーカスオブジェクトはフォーカス可能ではありません。
すぐにジャンプする必要がある次のフォーカス項目を見つけるために呼び出しますが、これは存在しないか、フォーカスできないため、このエラーがスローされます。次が非表示でフォーカスできない場合、または親が実際にfindFocus()呼び出しを処理できず、nullを返す場合に発生します。
したがって、解決策はかなり簡単です。この場合、次のようにIME_ACTIONに設定しないでください。テキストフィールドからテキストフィールドにすばやくジャンプできない場合は、それを実行可能にするか、アクションをDONEに切り替えます。
edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);
問題のビットの前のコードのコメントに注意してください:
これは、いくつかのデフォルトアクションの処理です。後方互換性のために、明示的なimeオプションが指定されていない場合、このデフォルトの処理は行わず、代わりにこれをアプリが予期する通常のEnterキーコードに変換することに注意してください。
Edittextタイプを設定した場合、または機能的に問題のない明示的なIMEを指定した場合、これは行われません。または、次のオブジェクトまたは他のオブジェクトにフォーカスできる親オブジェクトがあります。フォールバックビットのレガシーコードのみで、可能なアクションが実行されない場合があります。
以前の答えはどれもうまくいきませんでした。 recyclerviewにeditTextがあり、次のeditTextが表示されていないときにフォーカスを受け取ることができませんでした。
私は問題の原因を確認しましたが、これはTextViewクラスにあります:
// This is the handling for some default action.
// Note that for backwards compatibility we don't do this
// default handling if explicit ime options have not been given,
// instead turning this into the normal enter key codes that an
// app may be expecting.
if (actionCode == EditorInfo.IME_ACTION_NEXT) {
View v = focusSearch(FOCUS_FORWARD);
if (v != null) {
if (!v.requestFocus(FOCUS_FORWARD)) {
throw new IllegalStateException("focus search returned a view "
+ "that wasn't able to take focus!");
}
}
return;
}
EditTextを更新して、エディターのアクションをリッスンし、これを行いました:
companyNameET.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_NEXT) {
View v1 = v.focusSearch(FOCUS_FORWARD);
if (v1 != null) {
if (!v.requestFocus(FOCUS_FORWARD)) {
return true;
}
}
return false;
} else return false;
}
});
TextViewのソースコードを追跡し、指定したエラーログを照合する別の解決策があります
TextView.Java:
if (!hasOnClickListeners()) {
View v = focusSearch(FOCUS_DOWN);
if (v != null) {
if (!v.requestFocus(FOCUS_DOWN)) {
throw new IllegalStateException(
"focus search returned a view " +
"that wasn't able to take focus!");
}
}
}
結果として、エラーの発生を回避するためにView.OnClickListenerを与えることができると思います。
例:textView.setOnClickListener(new OnClickListener);
私はこの問題を抱えており、次のように修正しました:
public void setEditable(boolean flag) {
mEditText.setFocusableInTouchMode(flag);
mEditText.setFocusable(flag);
mEditText.setClickable(flag);
}
これが発生する理由は、EditTextにnextFocusDown
として指定された無効なビューがある場合です。