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

时间:2015-01-12 13:13:32

标签: android performance android-activity android-fragments android-actionbar

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

我想用左抽屉做类似的事情。在一些片段上,我想显示左抽屉,而不想在其他片段上显示左抽屉。

我的应用程序中有一个Activity类,我正在附加这些片段,目前我在这个类中处理这两件事,代码已经变得混乱了if-else条件。

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

请告诉我一个更好的方法(最好在Fragment中处理它)

谢谢

7 个答案:

答案 0 :(得分:3)

片段可以通过getActivity()函数访问其活动,该函数将在调用onAttach()之后(以及onDetach()之前)返回非null活动。一旦片段具有活动,它就可以通过检查手动告诉它在活动中做正确的事情,包括更改操作栏按钮。

答案 1 :(得分:1)

为了显示取决于片段的选项,您只需执行以下操作:

setHasOptionsMenu(true)添加到片段的onCreate()方法,并告诉Activity重绘其选项菜单。

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

接下来覆盖onCreateOptionsMenu()方法,为您的片段提供所需的选项。

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

最后,请确保捕获活动的onOptionsItemSelected()方法中的所有选项。 (重要提示:请确保替换片段而不是添加片段。否则将为每个片段调用onCreateOptionsMenu()。)

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

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

答案 2 :(得分:0)

从名为ActionBarCombat的示例项目创建一个新项目,并在此处下载此示例应用程序http://www.learn2crack.com/2014/06/android-sliding-navigation-drawer-example.html

我曾经将这两个结合起来,提出了一个具有操作栏属性以及左侧抽屉的应用程序

答案 3 :(得分:0)

为了构建你的代码,为什么不在你的活动中创建一些方法,比如displayRefreshIcon(boolean visible),你可以在其中处理这些项目的可见性。

从你的片段中你可以通过getActivity()函数调用这些方法(如frangulyan建议)。     if(getActivity()!= null&& getActivity()instanceof MyActivity){         ((MyActivity)getActivity())displayRefreshIcon(真)。     }

答案 4 :(得分:0)

在主线程或通常情况下,在某种程度上不可能对活动本身进行更改,因为片段是分离的模块,它们附加了活动但不是它们的一部分。 但是有一个快捷方式是将消息(处理程序)发送到活动以更新显示相应的操作栏组件 (最有可能的情况是,如果您仅将此片段用于特定活动)。

答案 5 :(得分:0)

你应该创建一个基本片段,每个片段应该扩展baseFragment,在onResume方法中你必须检查Fragment的实例,然后根据它们你可以更新actionBar View。

答案 6 :(得分:0)

使用任何类型的片段,您应该只能访问这些方法(您必须覆盖它们):onCreateOptionsMenu,onPrepareOptionsMenu和onOptionsItemSelected。这些方法应该为您提供足够的句柄来为每个片段创建一个菜单。您可以为每个片段创建一个菜单布局文件,并在设计的方法中处理它们。方法:

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