8

当我尝试将 ActionbarSherlock 添加SearchView到我的 ActionBar 时,应用程序会在应显示活动时立即崩溃。作为这个原因,我在 LogCat 中发现了以下内容:

10-22 21:22:51.070: W/MenuInflater(21873): Cannot instantiate class: com.actionbarsherlock.widget.SearchView
...
10-22 21:22:51.070: W/MenuInflater(21873): Caused by: java.lang.reflect.InvocationTargetException
10-22 21:22:51.070: W/MenuInflater(21873):  at java.lang.reflect.Constructor.constructNative(Native Method)
10-22 21:22:51.070: W/MenuInflater(21873):  at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
10-22 21:22:51.070: W/MenuInflater(21873):  at android.view.LayoutInflater.createView(LayoutInflater.java:587)
10-22 21:22:51.070: W/MenuInflater(21873):  ... 32 more
10-22 21:22:51.070: W/MenuInflater(21873): Caused by: android.content.res.Resources$NotFoundException: Resource is not a ColorStateList (color or path): TypedValue{t=0x2/d=0x7f01001f a=-1}
10-22 21:22:51.070: W/MenuInflater(21873):  at android.content.res.Resources.loadColorStateList(Resources.java:2035)
10-22 21:22:51.070: W/MenuInflater(21873):  at android.content.res.TypedArray.getColorStateList(TypedArray.java:342)
10-22 21:22:51.070: W/MenuInflater(21873):  at android.widget.TextView.<init>(TextView.java:768)
10-22 21:22:51.070: W/MenuInflater(21873):  at android.widget.TextView.<init>(TextView.java:442)

当我使用常规android.widget.SearchView时,android:actionViewClass一切正常。我按照Android 网站上的教程进行操作。

这是我的菜单 xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/menu_search"
        android:actionViewClass="com.actionbarsherlock.widget.SearchView"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="ifRoom|collapseActionView"
        android:title="@string/menu_search"/>

    <item android:id="@+id/menu_add_page"
        android:title="@string/menu_add_page"
        android:icon="@drawable/ic_action_add"
        android:showAsAction="always" />

    <item android:id="@+id/menu_settings"
        android:title="@string/menu_settings"
        android:showAsAction="never" />
</menu>

这是相关的代码:

public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.activity_overview, menu);

    // Get the SearchView and set the searchable configuration
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    return true;
}

这是一个(已知的)错误,还是我在这里遗漏了其他东西?

4

5 回答 5

3

此问题是由于 v-14 版本的 Sherlock Theme 中缺少某些属性引起的。

我通过添加来修复它

<item name="textColorPrimary">@color/abs__primary_text_holo_light</item>
<item name="textColorPrimaryInverse">@color/abs__primary_text_holo_dark</item>

到夏洛克主题,它又运行得很漂亮。不确定是否理想的解决方案,但现在它可以工作:)

于 2012-12-19T08:56:13.600 回答
2

SearchViewin ActionbarSherlockis / 是一个已知问题。该dev分支包含支持,但它并不完整,并且似乎他们仍然对建议有问题。

请参阅此处和此处的github以供参考。

这是指向ActionBarSherlock>SearchView 来源的链接

于 2012-10-22T20:56:21.257 回答
1

正如hahnjo在这里提到的:

如果您使用主题Theme.Sherlock.Light.DarkActionBar并使用 创建视图new SearchView(this),它将无法正常工作... 可以使用的组合: Theme.Sherlock.Light.DarkActionBarwithnew SearchView(getSupportActionBar().getThemedContext()) Theme.Sherlock.LightTheme.Sherlock.Lightwithnew SearchView(this)

于 2013-03-22T11:09:41.577 回答
0

我也收到了这个错误,但这是因为我没有android:theme在. <application>AndroidManifest.xml

一旦我android:theme="@style/Theme.Sherlock"<application>节点上设置,问题就解决了。

于 2013-02-21T14:13:58.127 回答
0

我发现我必须执行以下所有操作才能使其正常工作:

确保在 AndroidManifest.xml 中设置了应用程序主题:

<application android:name="com.xxx.MyApplication" android:theme="@style/AppTheme">

我将“缺失”设置添加到基本样式中:

<style>
    <item name="textColorPrimary">@color/abs__primary_text_holo_light</item>
    <item name="textColorPrimaryInverse">@color/abs__primary_text_holo_dark</item>
    <item name="searchDropdownBackground">@drawable/abs__search_dropdown_dark</item>
    <item name="searchViewTextField">@drawable/abs__textfield_searchview_holo_dark</item>
    <item name="searchViewTextFieldRight">@drawable/abs__textfield_searchview_right_holo_dark</item>
    <item name="searchViewCloseIcon">@drawable/abs__ic_clear</item>
    <item name="searchViewSearchIcon">@drawable/abs__ic_search</item>
    <item name="searchViewGoIcon">@drawable/abs__ic_go</item>
    <item name="searchViewVoiceIcon">@drawable/abs__ic_voice_search</item>
    <item name="searchAutoCompleteTextView">@style/Widget.Sherlock.SearchAutoCompleteTextView</item>
 </style>

然后更新我的 Activity.onCreateOptionsMenu() 以将“主题上下文”传递给菜单充气器,例如:

@Override
public boolean onCreateOptionsMenu(final Menu menu)
{
    final MenuInflater inflater = new MenuInflater(this.getSupportActionBar().getThemedContext());
    inflater.inflate(R.menu.main_menu, menu);
    this.initSearchView(menu);
    return true;
}

然后将相同的主题上下文传递给 SearchView 创建/初始化:

private void initSearchView(final Menu menu)
{
    final SearchManager searchManager = (SearchManager) this.getSystemService(Context.SEARCH_SERVICE);
    final MenuItem searchViewMenuItem = menu.findItem(R.id.menu_search);

    final SearchView searchView = new SearchView(this.getSupportActionBar().getThemedContext());
    searchView.setSearchableInfo(searchManager.getSearchableInfo(this.getComponentName()));
    searchView.setIconifiedByDefault(false);
    searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(final View v, final boolean hasFocus)
        {
            if (!hasFocus)
            {
                // Collapse the searchbox on ActionBar
                searchViewMenuItem.collapseActionView();
            }
        }
    });
}

我希望这对某人有所帮助,或者它得到“修复”,这样就可以了。

于 2013-09-29T07:29:28.393 回答