Android 工具栏菜单项在片段中单击
我知道有人问过我这个问题,但在看了这些答案后,我无法解决我的问题。我有一个带有片段的活动。 在fragment中,我添加了工具栏,我想处理来自片段的工具栏菜单项click事件 在菜单中,我添加了一个共享按钮。我得到了向上导航的点击事件回调(箭头home按钮),但是我的片段中没有得到共享按钮的点击事件回调 你能告诉我我做错了什么吗Android 工具栏菜单项在片段中单击,android,android-toolbar,Android,Android Toolbar,我知道有人问过我这个问题,但在看了这些答案后,我无法解决我的问题。我有一个带有片段的活动。 在fragment中,我添加了工具栏,我想处理来自片段的工具栏菜单项click事件 在菜单中,我添加了一个共享按钮。我得到了向上导航的点击事件回调(箭头home按钮),但是我的片段中没有得到共享按钮的点击事件回调 你能告诉我我做错了什么吗 menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xm
menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.rahul.haridasasampada.details.DescriptionActivity">
<item
android:id="@+id/action_share"
android:title="Share"
android:orderInCategory="100"
app:showAsAction="always"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
</menu>
我的代码片段-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
// some code
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ActionBarActivity actionBarActivity = (ActionBarActivity) getActivity();
Toolbar toolbar = (Toolbar) getView().findViewById(R.id.toolbar_actionbar);
actionBarActivity.setSupportActionBar(toolbar);
toolbar.setOnMenuItemClickListener(this);
toolbar.inflateMenu(R.menu.menu_description);
}
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.action_share:
if (menuItem.getItemId() == R.id.action_share)
Log.d("debug","action share has clicked");
return true;
}
return false;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
Log.d("debug", "fragment : onCreateOptionsMenu");
MenuItem shareMenuItem = menu.findItem(R.id.action_share);
mShareActionProvider =(ShareActionProvider)MenuItemCompat.getActionProvider(shareMenuItem);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
Log.d("debug","fragment : action home has clicked");
return true;
case R.id.action_share:
Log.d("debug","fragment: action share has clicked");
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View detailFragmentView = inflater.inflate(R.layout.fragment_description, null);
return detailFragmentView;
}
您应该从activity类中获取指针工具栏,并在fragment类中使用充气菜单 你可以看看这个例子:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
activity = ((DescriptionActivity ) getActivity());
Toolbar tollbar=getView.findViewById(R.id.your_toolbar);
activity.setSupportActionBar(toolbar);
activity.toolbar.inflateMenu(R.menu.menu_search);
activity.toolbar.setOnMenuItemClickListener(this);
}
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.action_search:
break;
}
return false;
}
从Android文档中,对于
片段
:
创建选项菜单(菜单菜单,菜单充气机)
初始化“活动”的“标准选项”菜单的内容。您应该将菜单项放入到菜单中。要调用此方法,必须先调用SetHasOptions菜单(布尔值)
因此,如果您想在Fragment中控制actionbar菜单,那么您必须在Fragment的onCreate(…)中更好地调用sethasOptions菜单
方法:
同样重要的是,对于相同的工具栏
,充气菜单
不应同时使用和onCreateOptions菜单
,充气菜单
用于独立,而无需将工具栏
设置为操作栏
建议:
将一个工具栏
放在活动
中,作为应用程序的操作栏
,另一个工具栏
独立在片段
中
希望这有帮助 请参考此链接,了解单击片段选项菜单单击为什么要将工具栏放在片段中?它应该在活动中我正在使用一个主细节流,并且我已经阅读了一些我们应该在片段中使用工具栏的地方
到活动,可以吗?@Xcihnegn是的,我之所以将此设置到活动,是因为操作栏提供了向上导航。好的,刚刚对您的问题做出了回答,希望它能工作谢谢@mustafasevgi,但我使用的是主细节流,我想要工具栏来显示我的详细片段。@RahulChaurasia谢谢您的回答,我更新了我的答案,请检查一下。我试过了,但不起作用。另外,工具栏在片段中,对吗?那么为什么要写“activity.toolbar.setOnMenuItemClickListener(this);”我已经按照您的建议对代码(片段内部)进行了更改,但它不起作用。任何帮助都将不胜感激。@RahulChaurasia您能添加完整的活动代码吗?是的,我已经编写了SethasOptions菜单(true);但不起作用。请检查我的完整活动和片段代码。此外,它应该在不使用Toolbar.inflateMenu()的情况下工作。检查这是什么工具栏。flageMenu()
@Xchinegn,这是mustafasevgi的建议。检查他的回答OK mustafasevgi的解决方案是针对standalone的,但是如果您使用standalone,那么您不应该将工具栏设置为ActionBar
,对吗?是的,我在片段中完全添加了独立工具栏,而根本没有使用ActionBar。通常,如果答案中包含对代码意图的解释,以及在不介绍其他内容的情况下解决问题的原因,则会更有帮助。如果您的所有其他活动都显示相同的菜单项,则此选项不适用。断开开关的情况在何处?@ArthTilva返回true代码>起作用。而且,在结束开关之前,返回false
。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.training1_fragment, container,
false);
setHasOptionMenu(true);
return v;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_save :
{
//Write here what to do you on click
return true;
}
}
return super.onOptionsItemSelected(item);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.training1_fragment, container,
false);
setHasOptionMenu(true);
return v;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_save :
{
//Write here what to do you on click
return true;
}
}
return super.onOptionsItemSelected(item);
}
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
public class MyFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_list, container, false);
Toolbar toolbar= (Toolbar) getActivity().findViewById(R.id.toolbar);
toolbar.inflateMenu(R.menu.menu_main);
toolbar.setOnMenuItemClickListener(this);
return rootView;
}
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.action_menu:
//do sth here
return true;
}
return false;
}