Android 工具栏菜单项在片段中单击

Android 工具栏菜单项在片段中单击,android,android-toolbar,Android,Android Toolbar,我知道有人问过我这个问题,但在看了这些答案后,我无法解决我的问题。我有一个带有片段的活动。 在fragment中,我添加了工具栏,我想处理来自片段的工具栏菜单项click事件 在菜单中,我添加了一个共享按钮。我得到了向上导航的点击事件回调(箭头home按钮),但是我的片段中没有得到共享按钮的点击事件回调 你能告诉我我做错了什么吗 menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xm

我知道有人问过我这个问题,但在看了这些答案后,我无法解决我的问题。我有一个带有片段的活动。 在fragment中,我添加了工具栏,我想处理来自片段的工具栏菜单项click事件

在菜单中,我添加了一个共享按钮。我得到了向上导航的点击事件回调(箭头home按钮),但是我的片段中没有得到共享按钮的点击事件回调

你能告诉我我做错了什么吗

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