Android 如何根据片段的类型设置其操作栏和左抽屉属性

Android 如何根据片段的类型设置其操作栏和左抽屉属性,android,performance,android-activity,android-fragments,android-actionbar,Android,Performance,Android Activity,Android Fragments,Android Actionbar,我的应用程序中有各种类型的片段,ActionBar上有3个图标(过滤、刷新和排序),但我不想在每个片段中显示所有3个图标。根据片段,我只能展示其中的一些 // No support library - support library api slightly different @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Add Fragment menu element

我的应用程序中有各种类型的片段,ActionBar上有3个图标(过滤、刷新和排序),但我不想在每个片段中显示所有3个图标。根据片段,我只能展示其中的一些

// No support library - support library api slightly different
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Add Fragment menu elements to Activity menu elements
    inflater.inflate(R.menu.myfragmentmenu, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
我想用左抽屉做类似的事情。在某些片段上,我想显示左抽屉,而不想在其他片段上显示左抽屉

我在我的应用程序中有一个活动类,我在上面附加了这些片段,目前我在这个类中处理这两件事情,代码已经变得混乱不堪

所以现在我正在检查片段名称,然后根据它设置操作栏图标和左抽屉属性

请告诉我一个更好的方法(最好在片段本身中处理)


谢谢

从名为ActionBarCombat的示例项目创建一个新项目,并在此处下载此示例应用程序


我曾经将这两者结合起来,设计了一个具有操作栏属性的应用程序,并且左抽屉片段可以通过函数访问其活动,该函数将在调用后(和调用前)返回非空活动。片段拥有活动后,它可以通过检查告诉它在活动中手动执行您正在执行的任何操作,包括更改操作栏按钮。

若要稍微构造代码,为什么不在活动中创建一些方法,如displayRefreshIcon(布尔可见),在其中处理这些项目的可视性

从片段中,您可以通过getActivity()函数调用这些方法(如frangulyan建议的)。 如果(getActivity()!=null&&getActivity()实例为MyActivity){ ((MyActivity)getActivity()).displayRefreshIcon(true);
}

在主线程或通常情况下,在活动本身中进行更改是不可能的,因为片段是独立的模块,与活动相连,而不是活动的一部分。 但是有一个快捷方式,就是将消息(处理程序)发送到“活动”以更新显示相应的actionbar组件
(最有可能的情况是,如果您仅将此片段用于特定活动)。

在那里,您应该制作一个基本片段,每个片段都应该扩展baseFragment,在onResume方法中,您必须检查片段的实例,然后根据它们,您可以更新actionBar视图。

为了根据片段显示选项,您可以简单地执行以下操作:

SethasOptions菜单(true)
添加到片段的
onCreate()
方法,并告诉活动重新绘制其选项菜单

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    getActivity().invalidateOptionsMenu();
}
接下来覆盖
onCreateOptions菜单()
方法,以增加片段所需的选项

// No support library - support library api slightly different
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Add Fragment menu elements to Activity menu elements
    inflater.inflate(R.menu.myfragmentmenu, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
最后,确保捕获活动的
onoptionItemSelected()
方法中的所有选项项。 (重要提示:确保替换片段而不是添加片段。否则,将为每个片段调用
onCreateOptions菜单()

为了禁用和启用抽屉,您可以将以下方法添加到活动中,并从片段中调用它:

public void toggleDrawer(boolean enabled) {
    if (enabled) {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        mDrawerToggle.setDrawerIndicatorEnabled(true);
    } else {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        mDrawerToggle.setDrawerIndicatorEnabled(false);
    }    
}

使用任何类型的片段,您都应该可以访问这些方法(必须重写它们):onCreateOptions菜单、onPrepareOptions菜单和onOptions ItemSelected。这些方法应该为您提供足够的句柄来创建每个片段的菜单。您可以为每个片段创建一个菜单布局文件,并使用为此设计的方法处理它们。方法:

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

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}

您好,亲爱的,您不能从内部片段编辑活动,但我已经在回答中讨论了解决方案。