【问题标题】:Options Menu not displaying on ActionBar选项菜单未显示在操作栏上
【发布时间】:2014-06-29 16:55:49
【问题描述】:

我想使用ActionBarActivityActionBar 中显示Menu

我在单击选项按钮时得到选项菜单,而不是显示在操作栏的顶部。

我需要顶部的选项菜单,而不是从 2.3 开始点击选项菜单

我的代码:

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ActionBar actionBar = getSupportActionBar();
    actionBar.setSubtitle("mytest");
    actionBar.setTitle("Testing");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_action, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_item_one:
        Toast.makeText(this, "clicked search", Toast.LENGTH_SHORT).show();
        break;

    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        return rootView;
    }
}

}

我的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/menu_item_one"
    android:icon="@drawable/ic_launcher"
    android:showAsAction="always"
    android:title="@string/action_settings"/>
<item
    android:id="@+id/menu_item_two"
    android:icon="@drawable/ic_launcher"
    android:showAsAction="always"
    android:title="@string/action_settings"/>

</menu>

【问题讨论】:

  • 显示你的 xml 菜单。
  • @Suvtruf 我更新了我的问题
  • 我用的是ActionBarSherlock,所以没有这个问题)
  • 如何在不使用ABS的情况下得到它 Android说默认会得到
  • 如果您使用的是宽度较小的设备或模拟器,ActionBar 中可能不会显示项目。尝试使用大屏幕设备。

标签: android android-actionbar options android-menu


【解决方案1】:

试试看:

在“../res/menu/menu_main.xml”上创建 XML 文件

ma​​nu_main.xml

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

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

</menu>

“showAsAction”上的“never”选项很重要,如果您将选项始终显示在 ActionBar 上。

那么现在我们必须在 MainActivity.java 上关联这个选项(你想要的类)。

MainActivity.java

public class MainActivity extends Activity {

    ...

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

现在我们定义了操作栏的元素,就是知道如何响应用户对它们的击键。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.menu_settings:
            Log.i("ActionBar", "Settings!");;
            //open Activity,Fragments or other action
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

如果您的菜单上有更多选项,请仅在 XML menu_main.xml 上添加项目,并在主体类上添加其他“案例”。

例如:

MainActivity.java

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.menu_save:
            Log.i("ActionBar", "Save!");;
            //open Activity,Fragments or other action
            return true;
        case R.id.menu_settings:
            Log.i("ActionBar", "Settings!");;
            //open Activity,Fragments or other action
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

menu_main.xml

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

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

        <item
            android:id="@+id/menu_save"
            android:showAsAction="never"
            android:icon="@android:drawable/ic_menu_save"
            android:title="@string/menu_save"/>

    </menu>

【讨论】:

  • 这里唯一的变化是扩展ActionBarActivity而不是Activity
  • 是的,改变它然后说我。
【解决方案2】:

这可能是因为您的设备有一个可以打开菜单的选项按钮,因此 Android 不会绘制启动器图标。

http://blog.vogella.com/2013/08/06/android-always-show-the-overflow-menu-even-if-the-phone-as-a-menu/

【讨论】:

    【解决方案3】:

    根据下面的 android 文档,在您的 onCreateOptionsMenu 方法中尝试使用 return super.onCreateOptionsMenu(menu); 而不是 return true...

    http://developer.android.com/guide/topics/ui/actionbar.html#ActionItems

    按照上面的android文档...

    ActionBar API 最初是在 Android 3.0(API 级别 11)中添加的,但它们也可以在支持库中使用,以便与 Android 2.1(API 级别 7)及更高版本兼容。 所以,如果你想在 android 2.3 中使用 ActionBar,那么你必须使用 Android 支持库

    编辑:

    您的菜单 XML 需要如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:yourapp="http://schemas.android.com/apk/res-auto"
    >
    
    <item android:id="@+id/item_menu_ok" 
    android:icon="@drawable/ic_action_ok"
    android:title="@string/ok" 
    yourapp:showAsAction="always"/>
    
    <item android:id="@+id/item_menu_cancel" 
    android:icon="@drawable/ic_action_cancel"
    android:title="@string/cancel"
    yourapp:showAsAction="always"/>
    
    </menu>
    

    yourapp 替换为您的应用名称或任何命名空间。

    【讨论】:

    • 是的!我试过return super.onCreateOptionsMenu(menu);,但没有结果。我添加了库并完成了所有操作
    • 查看我编辑的答案以使用 android 支持库创建菜单 XML 文件。
    • 如果你点击编辑问题,你可以看到我保留的菜单标题。我猜它不是yourapp它的appandroid:app
    • 更多详情请关注此链接...hmkcode.com/add-actionbar-to-android-2-3-x
    • 请注意,上面的 showAsAction 属性使用了在 &lt;menu&gt; 标记中定义的自定义命名空间。这在使用支持库定义的任何 XML 属性时是必需的,因为这些属性在旧设备上的 Android 框架中不存在。因此,您必须使用自己的命名空间作为支持库定义的所有属性的前缀。见Using XML attributes from the support library
    【解决方案4】:

    我不是 100% 确定,但看起来您的菜单 XML 文件中应该有一个 menu。在菜单中,添加项目。像这样:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/main_menu" >
    
        <item...
    
        <item...
    
    </menu>
    

    也许这行得通。

    一般来说,还有一些其他的事情要记住。 Android 自己决定在 ActionBar 中显示什么(取决于适合那里的内容和其他参数)。不适合 ActionBar 的内容会进入溢出。

    【讨论】:

    • 如果您点击我的问题上的编辑,您可以看到这些行
    • 不幸的是,这些问题在发布问题后不可见
    【解决方案5】:

    在你的 oncreate() 中执行此操作

    ActionBar actionBar = getActionBar();
    actionBar.show();
    

    这应该做你想做的事。 Action Bar

    【讨论】:

    • 我需要getSupportActionBar(); 来支持所有设备
    • 然后放actionbar.show();初始化之后。
    【解决方案6】:

    好的,让我们尝试另一个答案。 如果,无论出于何种原因,Android 决定不在操作栏中显示项目,那么您所看到的确实是正确的行为。不在操作栏中的项目显示在溢出中。

    项目未显示在操作栏中的一个原因是它们没有定义图标。

    你确实定义了一个图标,就像这样,

     android:icon="@drawable/ic_launcher"
    

    我怀疑这是问题所在。启动器图标的大小(大)与操作栏项目(小)不同。尝试以正确的大小定义图标并查看它是否显示。

    http://developer.android.com/design/style/iconography.html

    编辑:有一个操作栏图标包可以帮助您入门,因此您可以测试它是否有效。下载它并使用eclipse导入一些图标..

    【讨论】:

    • 我是否需要在清单文件中声明。抱歉,清单文件中已经存在
    • 嗯?我认为问题在于图标 ic_launcher.png 的大小错误。尝试添加大小正确的图标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多