【问题标题】:Action Bar not showing action view icons操作栏不显示操作视图图标
【发布时间】:2013-08-07 09:09:44
【问题描述】:

我正在使用新的操作栏支持,我的所有操作视图都显示为溢出而不是栏中的图标。我的应用适用于 7+ API。

家庭活动:

public class HomeActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle(R.string.app_name);
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.home, menu);
        return true;
    }
}

home.xml

<item
    android:id="@+id/action_settings"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/action_settings"/>
<item
    android:id="@+id/action_browse"
    android:orderInCategory="100"
    android:showAsAction="never"
    android:title="@string/title_activity_browse"/>
<item
    android:id="@+id/action_search"
    android:actionViewClass="android.widget.SearchView"
    android:icon="@android:drawable/ic_menu_search"
    android:showAsAction="ifRoom|collapseActionView"
    android:title="@string/text_search"/>
<item
    android:id="@+id/action_scan"
    android:icon="@drawable/action_scan"
    android:showAsAction="always"
    android:title="@string/title_activity_browse"/>

我正在使用 4.3 的 Nexus 7 和使用 2.3.3 且没有图标的 LGP500 上进行部署。我还在清单上添加了 android:theme="@style/Theme.AppCompat.Light.DarkActionBar" 并且我的项目正确地引用了官方文档中描述的 android-support-v7-appcompat。

【问题讨论】:

标签: android android-actionbar android-support-library android-actionbar-compat


【解决方案1】:

您必须定义您的 menu 资源文件以及支持库的属性。

为了实现后端支持,它会读取它们而不是旧 Android 版本中定义的支持。

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

<item
    android:id="@+id/action_settings"
    android:orderInCategory="100"
    android:showAsAction="never"
    yourapp:showAsAction="never"
    android:title="@string/action_settings"/>
<item
    android:id="@+id/action_browse"
    android:orderInCategory="100"
    android:showAsAction="never"
    yourapp:showAsAction="never"
    android:title="@string/title_activity_browse"/>
<item
    android:id="@+id/action_search"
    android:actionViewClass="android.support.v7.widget.SearchView"
    android:icon="@android:drawable/ic_menu_search"
    android:showAsAction="ifRoom|collapseActionView"
    yourapp:showAsAction="ifRoom|collapseActionView"
    yourapp:actionViewClass="android.support.v7.widget.SearchView"
    android:title="@string/text_search"/>
<item
    android:id="@+id/action_scan"
    android:icon="@drawable/action_scan"
    android:showAsAction="always"
    yourapp:showAsAction="always"
    android:title="@string/title_activity_browse"/>

</menu>

注意 请记住,SearchView 类已更改。它现在使用支持库中的那个,因此您还必须更新 onCreateOptionsMenu() 中的代码

编辑: here 是一个关于如何从 ActionBarSherlok 迁移到 AppCompat 的非常好的教程

【讨论】:

  • 是的,除了搜索视图外,它工作正常:图标显示正确,但如果点击它,什么也不会发生......无论如何,我真的很难理解这一点,是吗一种默认模式覆盖?为什么我没有找到任何关于它的文档? :(
  • 是的。基本上为了能够实现支持,他们无法读取仅在 API 11 之后定义的新菜单属性(?不确定),因此他们定义了新属性并使用它们。我将使用正确的 searchView 实施来编辑我的回答。
  • 这只是一个猜测,但如果您将 android:actionViewClass 更改为 android.widget.SearchView 您可能不会收到该错误。但我认为那你必须通过代码来管理差异
  • yourapp:actionViewClass 中的“yourapp”是什么。显然这不是包名,因为我尝试了 'com.mycompany.myproject` 却一无所获。
  • 如果你使用AppCompat MenuInflater,那些带有yourapp前缀的应该足够了
【解决方案2】:

一个常见的错误是忘记在您的 string.xml 文件中包含标题字符串。确保将它包含在每个菜单项中。

假设我们的菜单 xml 包含以下项目:

    <item
    android:id="@+id/toggle_action"
    android:orderInCategory="1"
    android:showAsAction="ifRoom"
    android:title="@string/toggle_action"/>

如果我们忘记包含字符串 toggle_action 的值,那么操作栏图标将不会显示。

转到您的 strings.xml 文件并添加以下内容:

    <string name="toggle_action">TOGGLE</string>

【讨论】:

  • 你能说得更具体点吗? “title”字符串指的是什么?