35

我的片段用特定的选项项替换了父 Activity 选项,但是当我单击该项目时,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;
}

日志输出:

MainActivity.onCreateOptionsMenu
Fragment.onCreateOptionsMenu
MainActivitiy.onOptionsItemSelected

那么我怎样才能onOptionsItemSelected调用片段呢?

4

5 回答 5

63

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

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

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

于 2013-10-18T12:39:07.417 回答
51

您没有链接到活动方法中的超类。请有onCreateOptionsMenu()return super.onCreateOptionsMenu(menu),有onOptionsItemSelected()return super.onOptionsItemSelected(item)(您正在处理的项目除外,它应该returntrue表示您已经处理了该事件)。

于 2013-08-08T18:33:39.593 回答
15

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

于 2016-06-21T20:18:02.390 回答
1

我找到了解决方案,即

片段类

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

活动.class

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

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

        default:
            if(fragment != null)
                fragment.onOptionsItemSelected(item);
    }
    return true;
}
于 2019-12-24T04:51:33.020 回答
0

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

The symptoms were a wiggly red underline on my Override and IDE message indicating that onOptionsItemSelected will not be called.

于 2020-10-12T21:12:15.847 回答