片段的onOptionsItemSelected不会被调用

时间:2013-08-08 18:31:15

标签: android android-fragments

我的片段用一个特定的选项替换了父活动选项,但是当我点击该项时,只有活动的onOptionItemSelected被调用,尽管我已经覆盖了Fragment中的方法。我错过了什么吗?

片段方法:

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

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    Log.d(TAG, "Fragment.onCreateOptionsMenu");

    if (mPasteMode) {
        menu.clear();
        inflater.inflate(R.menu.contexual_paste, menu);
        getActivity().getActionBar().setTitle("PasteMode");
    }
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d(TAG, "Fragment.onOptionsItemSelected");

    switch (item.getItemId()) {
        case R.id.context_action_paste:
            Toast.makeText(getActivity(),
                     "It worked ",
                    Toast.LENGTH_SHORT).show();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

活动的方法:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d(TAG, "MainActivitiy.onOptionsItemSelected");
    switch (item.getItemId()) {
        case R.id.action_refresh:
            Toast.makeText(this, "Action Refresh selected", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
    return true;
}

Logcat输出:

MainActivity.onCreateOptionsMenu
Fragment.onCreateOptionsMenu
MainActivitiy.onOptionsItemSelected

那么如何让片段的onOptionsItemSelected调用?

5 个答案:

答案 0 :(得分:44)

如果您的活动的 onOptionsItemSelected 方法 returs true 则会在活动中使用该调用,并且不会调用片段的onOptionsItemSelected。 因此,通过super.onOptionsItemSelected调用在您的Activity onOptionsItemSelected方法或父类实现中返回false(默认实现返回false)。

根据Activity类javadoc,方法Activity.onOptionsItemSelected应该:

  

返回false以允许正常的菜单处理继续进行,在此处使用它是真的

答案 1 :(得分:42)

您没有在活动方法中链接到超类。请onCreateOptionsMenu()返回super.onCreateOptionsMenu(menu),并onOptionsItemSelected()返回super.onOptionsItemSelected(item)(您正在处理的项目除外,该项目应返回true以表明您拥有该项目处理了这个事件。)

答案 2 :(得分:10)

在我的情况下,我没有添加任何菜单项(即我没有在活动或片段中调用onCreateOptionsMenu)。但是,我需要使用片段中的操作栏主页(向上)按钮。为此,我必须确保在片段setHasOptionsMenu(true)方法中调用onCreateView()之后才能使用它。然后我的活动中不需要onOptionsItemSelected覆盖。

答案 3 :(得分:0)

我找到了解决方法,即

Fragment.class

 @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Do something that differs the Activity's menu here
    //MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.wifinity_setting, menu);
    for (int i = 0; i < menu.size(); i++) {
        MenuItem item = menu.getItem(i);
        SpannableString spanString = new SpannableString(menu.getItem(i).getTitle().toString());
        spanString.setSpan(new ForegroundColorSpan(Color.BLACK), 0, spanString.length(), 0); //fix the color to white
        item.setTitle(spanString);
    }
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case R.id.menu1:
            Intent intent3 = new Intent(context, activity.class);
            startActivity(intent3);
            return true;

    }
    return true;
}

ACtivity.class

覆盖onOptionsItemSelected() // fragmnets onOptionselected方法被称为.. 这个解决方案对我有用

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        default:
            if(fragment != null)
                fragment.onOptionsItemSelected(item);
    }
    return true;
}

答案 4 :(得分:0)

我同意当前接受的解决方案,但是另一个可能的原因是类引用不明确。我在项目中有一个名为MenuItem的自定义类,而我的片段正在将那个custom.MenuItem解释为参数类型,而不是android.view.MenuItem

症状是我的Override和IDE消息上的红色下划线,表明不会调用onOptionsItemSelected。