【问题标题】:Fragment's onOptionsItemSelected doesn't get called片段的 onOptionsItemSelected 没有被调用
【发布时间】:2013-08-08 18:31:14
【问题描述】:

我的 Fragment 将父 Activity 选项替换为特定的选项项,但是当我单击该项目时,即使我已经覆盖了 Fragment 中的方法,也只会调用活动的 onOptionItemSelected。我错过了什么吗?

片段的方法:

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

Activity的方法:

@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

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    如果您的 Activity 的 onOptionsItemSelected 方法返回 true调用会在 Activity 中消耗,而 Fragment 的 onOptionsItemSelected 不会被调用。强> 因此,在您的 Activity onOptionsItemSelected 方法中返回 false 或通过 super.onOptionsItemSelected 调用的父类实现(默认实现返回 false)。

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

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

    【讨论】:

    • 非常感谢您节省了我的时间。
    • 你完全正确!只需在MainActivity 中设置onOptionsItemSelected return false,一切都会按预期工作。
    【解决方案2】:

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

    【讨论】:

    • 需要注意的是setHasOptionsMenu(true)必须在is的fragment中调用过
    • 你拯救了我的一天
    【解决方案3】:

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

    【讨论】:

    • setHasOptionsMenu(true) 是修复,谢谢。
    【解决方案4】:

    我找到了解决方案,即

    片段.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;
    }
    

    活动.class

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
    
            default:
                if(fragment != null)
                    fragment.onOptionsItemSelected(item);
        }
        return true;
    }
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多