键盘和可折叠searchview出错:IllegalArgumentException:参数必须是此视图的后代

时间:2015-04-07 11:36:37

标签: android exception

在我的操作栏菜单中,我有一个像这样的搜索视图:

<item android:id="@+id/action_search"
    android:title="@string/action_search"
    android:icon="@drawable/ic_search_black_36dp"
    app:showAsAction="ifRoom|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView" />

搜索图标确实出现在操作栏上,当我点击它时,会出现一个文本输入字段,旁边还有一个后退按钮,键盘会打开。

enter image description here enter image description here

如果我关闭键盘并按下后退按钮,文本字段会消失但是如果我在键盘打开时单击后退按钮我会收到此错误:

04-07 15:57:08.411  14736-14736/cheetar.xorjin E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalArgumentException: parameter must be a descendant of this view
        at android.view.ViewGroup.offsetRectBetweenParentAndChild(ViewGroup.java:4257)
        at android.view.ViewGroup.offsetDescendantRectToMyCoords(ViewGroup.java:4194)
        at android.view.ViewRootImpl.scrollToRectOrFocus(ViewRootImpl.java:2122)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:1842)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
        at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4448)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
        at dalvik.system.NativeStart.main(Native Method)

除了触摸textview以外的其他内容时,我使用this answer来关闭键盘,除了单击后退按钮时它工作正常。我该如何解决这个问题?

如果需要更多信息,请告诉我它是什么,我会尽快添加。

谢谢

2 个答案:

答案 0 :(得分:2)

在Android上隐藏键盘的最佳方法是创建一个虚拟视图,并在您想要关闭键盘时请求对其进行聚焦。隐藏键盘会让你头疼这样的问题。当你想要键盘再次出来时,请求专注于编辑文本......这样你可以确定键盘是正确的类型(由android定义:inputType =&#34; ...&#34 ;) 我有一段时间使用它

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

public class KeyboardUtils {

    public static void hideKeyboard(View view) {
        InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

    public static void showKeyboard(View view) {
        InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInputFromInputMethod(view.getWindowToken(), 0);
    }

}

答案 1 :(得分:0)

您是否尝试过从SO到异常实施某些解决方案?例如,请检查此回答https://stackoverflow.com/a/12888761/3225458,并尝试在onTouchListener之前清除每个视图hideSoftKeyboard内的活动中的当前焦点。