(已弃用)片段onOptionsItemSelected未被调用

use*_*451 80 android android-fragments android-actionbar

编辑: 这个问题是针对已弃用的sherlock操作栏.现在应该使用Android支持库

我添加了一个名为share for action的操作栏菜单选项fragment,但是没有捕获选择事件

我这样添加它

@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    MenuItem item = menu.add(0, 7,0, R.string.share);
    item.setIcon(R.drawable.social_share).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
Run Code Online (Sandbox Code Playgroud)

试图捕捉它在这两个fragmentfragment activity类似

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case 7:
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("text/plain");
            share.putExtra(Intent.EXTRA_TEXT, "I'm being sent!!");
            startActivity(Intent.createChooser(share, "Share Text"));
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

我有setHasOptionsMenu(true);onCreate().

小智 145

同样的问题发生在我身上:

在Fragment中没有调用onMenuItemSelected事件

搜索谷歌无法找到解决方案,并在FragmentActivity中添加onMenuItemSelected方法无法解决它.

最后通过参考http://developer.android.com/guide/topics/ui/actionbar.html解决它

注意:如果您通过Fragment类的onCreateOptionsMenu回调添加了片段中的菜单项,那么当用户选择其中一个片段的项时,系统会为该片段调用相应的onOptionsItemSelected()方法.但是,活动有机会首先处理事件,因此系统在调用片段的相同回调之前调用活动上的onOptionsItemSelected().

这意味着只有在活动的onOptionsItemSelected()中没有该菜单项处理程序时,才会调用片段上的onOptionsItemSelected().

代码如下----- 在FragmentActivity上删除R.action.add的处理程序:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case android.R.id.home:
            popBackStack();             
            return true;        
        case R.id.action_search:
            searchAction();
            return true;
        case R.id.action_logout:
            userLogout();
            return true;
        //case R.id.action_add:
            //return true;    
        default:
            return super.onOptionsItemSelected(item);
    }   
}
Run Code Online (Sandbox Code Playgroud)

Fragment上R.action.add的处理程序如下所示:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d("onOptionsItemSelected","yes");
    switch (item.getItemId()) {
        case R.id.action_add:
            add();
            return true;    
        default:
            return super.onOptionsItemSelected(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,记得添加

    setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)

在Fragment中的onCreate方法中

  • 对我来说,为了拦截菜单点击片段,我必须在FragmentActivity的onOptionsItemSelected和片段的onOptionsItemSelected上返回"false",执行所需的行为. (12认同)

Mar*_* HC 128

我遇到了同样的问题,但我认为最好总结一下并介绍最后一步让它运转起来:

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

  2. onCreateOptionsMenu(Menu menu, MenuInflater inflater)在片段中覆盖(如果你想在Fragment的菜单中做一些不同的事情)和onOptionsItemSelected(MenuItem item)方法.

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

一个例子:

活动

@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;
}
Run Code Online (Sandbox Code Playgroud)

分段

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;
}
Run Code Online (Sandbox Code Playgroud)

  • +1这个答案看起来是正确的. (7认同)
  • Activity的`onOptionItemSelected`上的`return false`是关键.只需替换`return super.onOptionItemSelected(item);` (5认同)
  • 很好的答案.当它在片段中时,你应该将onCreateOptionsMenu(菜单菜单)更改为onCreateOptionsMenu(菜单菜单,MenuInflater inflater) (2认同)

Mal*_*nde 5

我注意到人们给你的解决方案是在活动中实现你的menue项的代码而不是片段.如果你已经在片段中实现了代码而不是活动'cos在我看来它看起来更好,那么我认为看起来会更有代价.为此,请执行以下操作:

活动

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu, menu);      
        return true;
    }

 @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {            
        switch (item.getItemId())
        {
            case R.id.SomeIDInTheMenueOfTheActivity:
            {
               //something();
                break;
            }
            default:
             //do something default and add the code under : 
             return super.onOptionsItemSelected(item);
        }
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

分段

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

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

     @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            switch (item.getItemId())
            {           
                case R.id.SomeIDInFragmentMenue:
                {             
                    break;
                }

                default:
                    return super.onOptionsItemSelected(item);
            }

            return true;
        }
Run Code Online (Sandbox Code Playgroud)

现在行(和喜欢):"return super.onOptionsItemSelected(item);" 在活动和片段中非常重要,因为好像你将遵循调试中的代码,你会看到将首先在Activity上调用menue事件函数,如果该项与activity的switch中的id不匹配 - 例如,degault行:"super.onOptionsItemSelected(item);" 将按照我们的意愿调用片段上的onOptionsItemSelected函数.(如果你有很多片段,请确保在它们中也有这一行,因为调用hirarchy可能有些复杂).


use*_*451 2

编辑操作栏夏洛克使用

我不得不使用

public boolean onMenuItemSelected(int featureId, MenuItem item) {
Run Code Online (Sandbox Code Playgroud)

在主要活动中捕获菜单项