我试图从一组片段中添加一个项目到选项菜单。

我已经创建了一个新的MenuFragment类,并扩展了我希望包含菜单项的片段。代码如下:

Java:

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);
    }
}

科特林:

class MenuFragment : Fragment {

    lateinit var fav: MenuItem

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

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

由于某种原因,onCreateOptionsMenu似乎没有运行。


当前回答

你的代码很好。方法中只少了super:

@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);
}

其他回答

博士TL;

使用“android.support.v7.widget”。工具栏,只需执行:

toolbar.inflateMenu(R.menu.my_menu)
toolbar.setOnMenuItemClickListener {
    onOptionsItemSelected(it)
}

独立的工具栏

大多数建议的解决方案,如setHasOptionsMenu(true),只有当父活动在其布局中有工具栏并通过setSupportActionBar()声明它时才有效。然后Fragments可以参与到这个ActionBar的菜单填充中:

Fragment. oncreateoptionsmmenu():初始化Fragment主机的标准选项菜单的内容。

如果你想要一个单独的工具栏和特定片段的菜单,你可以这样做:

menu_custom_fragment.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_save"
        android:title="SAVE" />
</menu>

custom_fragment.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    ...

CustomFragment.kt

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(layout.custom_fragment, container, false)
    val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
    toolbar.inflateMenu(R.menu.menu_custom_fragment)
    toolbar.setOnMenuItemClickListener {
        onOptionsItemSelected(it)
    }
    return view
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.menu_save -> {
            // TODO: User clicked the save button
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

是的,就是这么简单。你甚至不需要重写onCreate()或onCreateOptionsMenu()。

PS:这只适用于android.support.v4.app。Fragment和android.support.v7.widget。工具栏(也要确保在样式.xml中使用AppCompatActivity和AppCompat主题)。

在onCreate方法上添加setHasOptionMenu()

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

然后覆盖你的onCreateOptionsMenu

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.add("Menu item")
            .setIcon(android.R.drawable.ic_delete)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}

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

所以要清楚,如果你在片段中重写onCreateOptionsMenu(菜单菜单,MenuInflater inflater),确保你的活动类承载这个片段继承android.support.v7.app。ActionBarActivity(如果你想要支持低于API级别11)。

我继承了android.support.v4.app。FragmentActivity支持API级别低于11。

设置setHasMenuOptions(true)工作,如果应用程序有一个主题与动作栏,如theme . materialcomponents . daynight . darkactionbar或Activity有它自己的工具栏,否则oncreateoptionmenufragment不会被调用。

如果你想使用独立的工具栏,你要么需要获得活动,并将工具栏设置为支持操作栏

(requireActivity() as? MainActivity)?.setSupportActionBar(toolbar)

它让你的fragment onCreateOptionsMenu被调用。

其他的选择是,你可以用Toolbar . inflatemmenu (r.m menu. your_menu)和项目监听器来膨胀你的工具栏自己的菜单

toolbar.setOnMenuItemClickListener {
   // do something
   true
}

如果您想添加您的菜单自定义

@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);
}