如何在Android的Fragment中添加选项菜单

问题描述 投票:378回答:19

我正在尝试从一组片段中将一个项目添加到选项菜单。

我创建了一个新的MenuFragment类,并将其扩展为希望包含菜单项的片段。这是代码:

public class MenuFragment extends Fragment {

    MenuItem fav;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

由于某些原因,onCreateOptionsMenu似乎无法运行。

android android-fragments android-optionsmenu
19个回答
581
投票

调用超级方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO Add your menu entries here
    super.onCreateOptionsMenu(menu, inflater);
}

在代码中添加日志语句,以查看是否未调用该方法或代码未修改菜单。

还请确保您正在调用setHasOptionsMenu(boolean)中的onCreate(Bundle)来通知片段应参与选项菜单处理。


7
投票

我遇到了同样的问题,我的片段是ViewPager的页面。发生这种情况的原因是,我在实例化FragmentPagerAdapter时使用的是子片段管理器,而不是活动支持片段管理器。


3
投票

菜单文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/play"
        android:titleCondensed="Speak"
        android:showAsAction="always"
        android:title="Speak"
        android:icon="@drawable/ic_play">
    </item>
    <item
        android:id="@+id/pause"
        android:titleCondensed="Stop"
        android:title="Stop"
        android:showAsAction="always"
        android:icon="@drawable/ic_pause">
    </item>
</menu>

3
投票

您的代码很好。方法中只缺少超级:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO add your menu : 
    inflater.inflate(R.menu.my_menu, menu);
    //TODO call super
    super.onCreateOptionsMenu(menu, inflater);
}

2
投票

我发疯了,因为这里没有答案对我有用。

要显示我必须呼叫的菜单:


1
投票

创建片段视图后设置选项菜单对我来说效果很好。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);        
}

1
投票

我的问题略有不同。我做的一切都正确。但是我为承载该片段的活动继承了错误的类。

因此请注意,如果您要覆盖片段中的onCreateOptionsMenu(Menu menu, MenuInflater inflater),请确保承载此片段的活动类继承android.support.v7.app.ActionBarActivity(以防您想支持低于API级别11的情况。


1
投票

我想补充一件事,以及它对我不起作用的原因。

类似于Napster的答案。


1
投票

在菜单文件夹中,创建一个.menu xml文件并添加此xml


0
投票

如果以上所有方法均无效,则需要调试并确保已调用onCreateOptionsMenu函数(通过放置调试或写入日志...)

如果未运行,则可能是您的Android主题不支持操作栏。打开AndroidManifest.xml并通过主题支持操作栏设置android:theme的值


0
投票

在您的[[onCreate方法上,添加setHasOptionMenu()


190
投票

我有同样的问题,但我认为最好总结一下并介绍使之正常工作的最后一步:

  1. 在Fragment的onCreate(Bundle savedInstanceState)方法中添加setHasOptionsMenu(true)方法。

  2. 覆盖onCreateOptionsMenu(Menu menu, MenuInflater inflater)(如果要在Fragment的菜单中进行其他操作)和Fragment中的onOptionsItemSelected(MenuItem item)方法。

  3. onOptionsItemSelected(MenuItem item) Activity方法中,请确保在onOptionsItemSelected(MenuItem item) Fragment方法中实现菜单项操作时返回false。

示例:

活动] >>

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

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

        case R.id.activity_menu_item:

            // Do Activity menu item stuff here
            return true;

        case R.id.fragment_menu_item:

            // Not implemented here
            return false;
        default:
            break;
    }

    return false;
}

片段

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    ....
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Do something that differs the Activity's menu here
    super.onCreateOptionsMenu(menu, inflater);
}

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

        case R.id.activity_menu_item:

            // Not implemented here
            return false;
        case R.id.fragment_menu_item:

            // Do Fragment menu item stuff here
            return true;

        default:
            break;
    }

    return false;
}

154
投票

如果发现未调用onCreateOptionsMenu(Menu menu, MenuInflater inflater)方法,请确保从Fragment的onCreate(Bundle savedInstanceState)方法中调用以下代码:


53
投票

如果需要menu来刷新特定webview内部的Fragment,则可以使用:


23
投票

menu.xml中,您应该添加所有菜单项。然后,您可以隐藏不想在初始加载中看到的项目。


19
投票

TL; DR


16
投票

在展开菜单之前,您需要使用menu.clear()。

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.clear();
        inflater.inflate(R.menu.menu, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

10
投票

就我而言,这是步骤。

步骤1


8
投票

如果要添加菜单自定义项

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_custom, menu);
}
© www.soinside.com 2019 - 2024. All rights reserved.