【问题标题】:Fragment-specific options and context menus in AndroidAndroid 中的片段特定选项和上下文菜单
【发布时间】:2014-06-21 00:38:52
【问题描述】:

当一个 Activity 在多个片段之间切换时,我如何以“干净”和正确的方式实现选项和上下文菜单?

这里使用 NavigationDrawer 的示例代码:

public class MainActivity extends Activity implements OnFragmentInteractionListener {

    ...

    @Override
    public void onNavigationDrawerItemSelected(int position) {
        FragmentManager fragmentManager = getFragmentManager();

        switch (position) {
        case 0:
            fragmentManager.beginTransaction().replace(R.id.container, Fragment1.newInstance(null, null)).commit();
            break;
        case 1:
            fragmentManager.beginTransaction().replace(R.id.container, Fragment2.newInstance(null, null)).commit();
            break;
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        // ???

        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (!mNavigationDrawerFragment.isDrawerOpen()) {            
            getMenuInflater().inflate(R.menu.main, menu);
            restoreActionBar();
            return true;
        }

        // ???

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }

        // ???

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {

        //???

        super.onCreateContextMenu(menu, v, menuInfo);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {

        // ???

        return super.onContextItemSelected(item);
    }

    @Override
    public void onFragmentInteraction(String id) {
        // ???
    }
}

public class Fragment1 extends Fragment {

    // ???
    // option menu item A
    // listView1 context menu item X
}

public class Fragment2 extends Fragment {

    // ???
    // option menu item B
    // listView 2 context menu item Y
}

也许我走错了路。我有点迷茫……

【问题讨论】:

    标签: android menu fragment options android-context


    【解决方案1】:

    我了解您希望为每个片段设置不同的菜单?您可以为每个片段指定一个菜单,它只会在该片段附加到 Activity 时显示。下面的代码都属于一个片段。

    你必须告诉片段它有一个选项菜单:

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

    然后为这个片段膨胀菜单:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.about, menu);
    }
    

    然后处理菜单中的每一项被点击的时候:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle menu item click here
        return super.onOptionsItemSelected(item);
    }
    

    您还可以在活动中指定一个“全局”菜单,这些菜单项将与当前片段的菜单项一样显示。

    【讨论】:

    • 是的。根据需要工作!我也为我的 ListViews 的上下文菜单而苦苦挣扎,但现在它也能正常工作了。
    • 如果我使用的是ToolBar(支持库)而不是常规的ActionBar,该怎么办?我尝试了您的解决方案,但菜单不显示,我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多