使用AutoCompleteTextView作为工具栏组件将在显示下拉列表时导致神秘崩溃

时间:2015-07-05 07:53:33

标签: android android-layout

以前,在材料设计之前,我使用AutoCompleteTextView作为ActionBarSherlock的{​​{1}}。

AutoCompleteTextView as ActionBarSherlock的actionLayout(可行)

menu.xml文件

actionLayout

collapsible_searchtext.xml

<item 
    android:id="@+id/menu_search"
    android:title="@string/menu_search"
    app:showAsAction="always|collapseActionView"
    app:actionLayout="@layout/collapsible_searchtext"
    android:icon="?attr/actionBarSearchIcon"/>    

完美无缺。

目前,我尝试将我的应用迁移到资料设计。我尝试做的第一件事就是用<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <org.yccheok.jstock.gui.JStockAutoCompleteTextView android:id="@+id/search" android:dropDownWidth="match_parent" android:completionThreshold="1" android:inputType="textNoSuggestions" android:imeOptions="actionSearch|flagNoExtractUi" android:focusable="true" android:focusableInTouchMode="true" android:singleLine="true" android:hint="@string/search_stock" android:layout_gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ProgressBar android:id="@+id/progress_bar" android:layout_marginRight="15dip" android:layout_gravity="right|center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="invisible" style="?attr/editTextIndeterminateProgressStyle" /> </FrameLayout>

替换ActionBarSherlock

它完美无缺,直到我试着显示下拉。我输入以下异常,同时键入一些文本,这应触发下拉显示。

android.support.v7.widget.Toolbar

AutoCompleteTextView作为工具栏的组件(崩溃)

Toolbar.xml

java.lang.NullPointerException
    at android.widget.PopupWindow.getMaxAvailableHeight(PopupWindow.java:1233)
    at android.widget.ListPopupWindow.buildDropDown(ListPopupWindow.java:1098)
    at android.widget.ListPopupWindow.show(ListPopupWindow.java:532)
    at android.widget.AutoCompleteTextView.showDropDown(AutoCompleteTextView.java:1096)
    at android.widget.AutoCompleteTextView.updateDropDownForFilter(AutoCompleteTextView.java:971)
    at android.widget.AutoCompleteTextView.onFilterComplete(AutoCompleteTextView.java:953)
    at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:285)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5103)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)

jstock_search_view.xml

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/background_material_dark"
    android:elevation="4dp"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >

    <view class="org.yccheok.jstock.gui.JStockSearchView"
        android:id="@+id/search_view"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:visibility="gone"/>

</android.support.v7.widget.Toolbar>

注意:我的<view class="org.yccheok.jstock.gui.JStockSearchView$JStockAutoCompleteTextView" android:id="@+id/search_src_text" android:layout_height="36dip" android:layout_width="0dp" android:layout_weight="1" android:minWidth="@dimen/abc_search_view_text_min_width" android:layout_gravity="bottom" android:paddingLeft="@dimen/abc_dropdownitem_text_padding_left" android:paddingRight="@dimen/abc_dropdownitem_text_padding_right" android:singleLine="true" android:ellipsize="end" android:background="@null" android:hint="@string/search_stock" android:inputType="text|textAutoComplete|textNoSuggestions" android:imeOptions="actionSearch|flagNoExtractUi" android:dropDownHeight="wrap_content" android:dropDownAnchor="@id/search_edit_frame" android:dropDownVerticalOffset="0dip" android:dropDownHorizontalOffset="0dip" /> ... 模仿jstock_search_view.xml中的官方abc_search_view.xml。由于AppCompat不适合我的用例,我决定定制版AppCompat

我使用SearchView的代码非常简单。关于导致错误的原因,我没有多少暗示。

AutoCompleteTextView

要重现崩溃,我们只需要输入 Fr ,即可触发下拉。

我创建了一个最小可行代码 - https://github.com/yccheok/toolbar-experiment/tree/2d8853ab656b41837b004fd84060793f2b0b6ea6来证明这样的问题。

如果你发现任何暗示它为什么不起作用,我将非常感激。

1 个答案:

答案 0 :(得分:1)

遵循例外情况,它完全清楚发生了什么:&#34;锚定&#34; view为null。只需将其添加到JStockSearchView构造函数即可使其正常工作:

mSearchSrcTextView.setDropDownAnchor(R.id.search_plate);

您在XML中设置属性android:dropDownAnchor,但实际上从未在JStockSearchView中读取它。更好的解决方案可能是获取该属性(而不是硬编码锚ID)。