(已弃用)片段onOptionsItemSelected不会被调用((Deprecated) Fra

2019-07-20 10:09发布

编辑:这个问题问得已过时的福尔摩斯行动吧。 Android的支持库应该改为现在使用

我已经添加了名为份额为我的一个操作栏菜单选项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);
}

试图捕捉它在这两个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);
    }
}

我有setHasOptionsMenu(true);onCreate()

Answer 1:

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

onMenuItemSelected事件并没有得到所谓的碎片

谷歌搜索水湿找到一个解决方案,并在FragmentActivity添加onMenuItemSelected方法并不能解决问题。

最后,按照参考解决它http://developer.android.com/guide/topics/ui/actionbar.html

注意:如果你从一个片段添加菜单项,通过碎片类的onCreateOptionsMenu回调,那么,系统将调用此片段相应的onOptionsItemSelected()方法,当用户选择的片段的项目之一。 然而,活动都将有机会首先处理该事件,所以在系统调用上的活动onOptionsItemSelected()呼吁片段相同的回调之前。

这意味着只有当你没有在onOptionsItemSelected()是菜单项的处理程序上的活动时,onOptionsItemSelected()的片段将会被调用。

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

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

而对于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);
    }
}

最后,记得要加

    setHasOptionsMenu(true);

在片段的onCreate方法



Answer 2:

我有同样的问题,但我认为这是更好地总结和介绍的最后一步得到它的工作:

  1. 加入setHasOptionsMenu(true)在片段的方法onCreate(Bundle savedInstanceState)方法。

  2. 重写onCreateOptionsMenu(Menu menu, MenuInflater inflater) (如果你想要做的事在你的碎片的不同菜单)和onOptionsItemSelected(MenuItem item)方法,在你的片段。

  3. 里面的活动的onOptionsItemSelected(MenuItem item)方法,请确保您返回false时菜单项行动将在片段的实施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;
}

分段

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


Answer 3:

我注意到,该解决方案的人给你是为了实现在活动的menue项目的代码,而随后的片段。 我认为它会看起来更orgenized如果你已经执行片段中的代码,而不是在我看来活动“因为这一切看起来更好。 要做到这一点,请执行以下操作:

活动

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

分段

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

现在线(和喜欢):“回归super.onOptionsItemSelected(项目);” 在活动和片段是超级重要的,因为如果你将遵循在调试的代码,你将看到menue事件功能将首先呼吁活动,如果该项目不匹配的ID在该活动的开关 - 情况下,degault行: “super.onOptionsItemSelected(项目);” 将呼吁片段onOptionsItemSelected功能,因为我们想。 (如果你有很多碎片,一定要在他们那行,以及作为主叫hirarchy可能有点复杂)。



Answer 4:

我使用actionbarsherlock。 这为我工作:

1)创建dummy_menu.xml菜单

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" >
<item
      android:title=""
      android:showAsAction="never"
      android:id="@+id/dummyMenu"
        />

2)在活性膨胀这样的菜单。

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
   inflater.inflate(R.menu.dummy_menu,menu);
   return super.onCreateOptionsMenu(menu);
}

3)在片段onCreateView调用setHasOptionsMenu(真),并覆盖onCreateOptionsMenu和onOptionsItemSelected也隐藏dummyMenu像这样(在片段)

    @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_actions, menu);
    MenuItem item = menu.findItem(R.id.dummyMenu);
    item.setVisible(false);
    super.onCreateOptionsMenu(menu, inflater);
}

希望它可以帮助别人。



Answer 5:

编辑的动作条福尔摩斯使用

我不得不使用

public boolean onMenuItemSelected(int featureId, MenuItem item) {

在主要活动捕捉菜单项



Answer 6:

它是如此简单,你可以做你的片段,以确保您的行为将正确听:

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


Answer 7:

我有这个问题。 这是因为我overiding错误的方法

onOptionsItemSelected(com.actionbarsherlock.view.MenuItem项目)是我用什么。

请确保您使用的是正确的!



Answer 8:

您还没有链接到的活性的方法超类。 请有onCreateOptionsMenu()返回super.onCreateOptionsMenu(菜单),并已onOptionsItemSelected()返回super.onOptionsItemSelected(项目)(除了你正在处理的项目,它应返回true,表明你已经处理该事件)



文章来源: (Deprecated) Fragment onOptionsItemSelected not being called