android-fragments 未调用片段的onOptionsItemSelected

v09wglhw  于 2022-11-14  发布在  Android
关注(0)|答案(6)|浏览(187)

我的fragment用一个特定的选项项替换了父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);
    }
}

活动的方法:

@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呢?

but5z9lq

but5z9lq1#

如果活动的onOptionsItemSelected方法返回true,***则在活动中使用该调用,并且不调用片段的onOptionsItemSelected。***因此,在活动的onOptionsItemSelected方法或通过super.onOptionsItemSelected调用的父类实现中返回false(默认实现返回false)。
根据活动类javadoc,方法Activity.onOptionsItemSelected应该:
返回false以允许正常菜单处理继续,返回true以在此处使用它

30byixjq

30byixjq2#

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

xienkqul

xienkqul3#

在我的例子中,我没有添加任何菜单项(也就是说,我没有在Activity或片段中调用onCreateOptionsMenu)。但是,我需要在片段中使用操作栏home(up)按钮。为此,我必须确保在片段的onCreateView()方法中调用了setHasOptionsMenu(true),然后才能工作。这样,我就不需要在Activity中使用onOptionsItemSelected覆盖。

nbysray5

nbysray54#

我找到了解决办法
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;
}
epfja78i

epfja78i5#

我同意目前接受的解决方案,但另一个可能的原因是有一个不明确的类引用。我在项目中有一个名为MenuItem的自定义类,我的Fragment将该custom.MenuItem解释为参数类型,而不是android.view.MenuItem
症状是在我的Override和IDE消息上出现一条红色的波浪下划线,指示将不会调用onOptionsItemSelected。

tjrkku2a

tjrkku2a6#

在这个问题上工作了几个小时后,我找到了一个解决方案。
您需要在活动中调用onOptionsItemSelected,但返回false,如下所示

override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return false
    }

下一步是将**setHasOptionsMenu(true)添加到片段onCreate()**中
最后,您可以在片段中调用onOptionsItemSelected并处理菜单项click

override fun onOptionsItemSelected(item: MenuItem): Boolean {
        //My awesome stuff
        return super.onOptionsItemSelected(item)
    }

就这样了。

相关问题