片段的onOptionsItemSelected不会被调用

Nim*_*a G 26 android android-fragments

我的片段用一个特定的选项替换了父Activity选项,但是当我点击该项时,只有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);
    }
}
Run Code Online (Sandbox Code Playgroud)

活动方法:

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

Logcat输出:

MainActivity.onCreateOptionsMenu
Fragment.onCreateOptionsMenu
MainActivitiy.onOptionsItemSelected
Run Code Online (Sandbox Code Playgroud)

那么如何才能onOptionsItemSelected调用片段呢?

fan*_*son 51

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

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

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

  • 非常感谢您节省了我的时间。 (2认同)

Com*_*are 45

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

  • 应该注意的是,必须在片段中为is调用setHasOptionsMenu(true) (7认同)

Tas*_*iwa 12

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