web-dev-qa-db-ja.com

致命的なクラッシュ:フォーカス検索でフォーカスを取得できないビューが返されました

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" />
32
ObAt

私はこれと同じクラッシュを経験しており、正確な状況のように聞こえませんが、おそらくこれはまだ役立つでしょう:

EditTextボックスが2つありました。下の方は上の方のネクストフォーカスダウンでした。場合によっては、下のボックスを非表示にするため、上のボックスからキーボードを次に押すと、下のボックスに移動しようとしますが、非表示になっているためクラッシュします。下のボックス(別のEditTextのNext Down Focusのターゲット)をフォーカス不可に設定することで、これを修正しました。

    EditText inputBox = (EditText)findViewById(R.id.Bottom_Box);
    inputBox.setFocusable(false);

これがお役に立てば幸いです。

17
jargetz

このエラーは、ImeOptionsがEditorInfo.IME_ACTION_NEXTまたはEditorInfo.IME_ACTION_PREVIOUSに設定されている場合に発生します。そのビューの親はフォーカス可能ではありませんが、または次に見つかったフォーカスオブジェクトはフォーカス可能ではありません。

すぐにジャンプする必要がある次のフォーカス項目を見つけるために呼び出しますが、これは存在しないか、フォーカスできないため、このエラーがスローされます。次が非表示でフォーカスできない場合、または親が実際にfindFocus()呼び出しを処理できず、nullを返す場合に発生します。

したがって、解決策はかなり簡単です。この場合、次のようにIME_ACTIONに設定しないでください。テキストフィールドからテキストフィールドにすばやくジャンプできない場合は、それを実行可能にするか、アクションをDONEに切り替えます。

edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);

問題のビットの前のコードのコメントに注意してください:

これは、いくつかのデフォルトアクションの処理です。後方互換性のために、明示的なimeオプションが指定されていない場合、このデフォルトの処理は行わず、代わりにこれをアプリが予期する通常のEnterキーコードに変換することに注意してください。

Edittextタイプを設定した場合、または機能的に問題のない明示的なIMEを指定した場合、これは行われません。または、次のオブジェクトまたは他のオブジェクトにフォーカスできる親オブジェクトがあります。フォールバックビットのレガシーコードのみで、可能なアクションが実行されない場合があります。

28
Tatarize

以前の答えはどれもうまくいきませんでした。 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;
        }
    });
10
Paramveer Singh

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);

4
Hsiao-Ting

私はこの問題を抱えており、次のように修正しました:

public void setEditable(boolean flag) {
    mEditText.setFocusableInTouchMode(flag);
    mEditText.setFocusable(flag);
    mEditText.setClickable(flag);
}
1

これが発生する理由は、EditTextにnextFocusDownとして指定された無効なビューがある場合です。

0
Cristan