在嵌套片段中使用OptionsMenu

时间:2015-08-14 16:49:24

标签: android menu nested fragment

我使用在我的主机活动 MenuActivity 中实现的NavigationDrawer模式。我的导航有3个项目:项目1,项目2,项目3。 每个项目都绑定到一个片段。

当我点击第1项时,我显示了一个片段A,它实现了一个带有多个片段(嵌套片段)的ViewPager。

在我的嵌套片段中,我使用以下方法给菜单充气(它运行正常!):

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

但是当我点击我的菜单的另一个元素(第2项 - >显示片段B或第3项>显示片段C)时,我的菜单(在我的嵌套片段中膨胀)始终可见但我希望它消失。

你能解决这个问题吗?提前谢谢。

5 个答案:

答案 0 :(得分:2)

当我遇到这个问题时,我通过为子片段和“根”片段设置setHasOptionMenu(true)来解决它。如果“root”片段或其他子片段不使用选项,那么无论如何它都没问题,因为你只需要在需要它的子片段中给菜单充气。

答案 1 :(得分:1)

我刚刚遇到问题并通过以下方式解决了问题:

<div class="banner">
    
</div>


<div class="inner">
    <div class="left"></div>
    <div class="main"></div>
    <div class="right"></div>
</div>

我注意到onDestroyOptionsMenu没有被调用,所以我只是通过OnDestroyView方法调用它,并将菜单可见性设置为@Override public void onDestroyOptionsMenu() { this.setMenuVisibility(false); super.onDestroyOptionsMenu(); Log.e(TAG, "onDestroyOptionsMenu"); } @Override public void onDestroyView() { onDestroyOptionsMenu(); super.onDestroyView(); }

答案 2 :(得分:1)

只需保存子片段,然后覆盖setMenuVisability:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>


#define MAX_LINE_LENGTH (256)

// prototypes
void source_to_destination(FILE *source , FILE *destination);


int main( int argc, char * argv[] )
{
    if( 3 != argc )
    { // not correct number of command line parameters
        fprintf( stderr, "USAGE: %s <sourceFili> <destinationFile>\n", argv[0]);
        exit( EXIT_FAILURE );
    }

    // implied else, correct number of arguments

    FILE *fp_in = NULL;
    if( NULL == (fp_in = fopen( argv[1], "r") ) )
    { // then fopen failed
        fprintf( stderr, "fopen for input file: %s failed due to %s\n", argv[1], strerror(errno) );
        exit( EXIT_FAILURE );
    }

    // implied else, fopen input file successful

    FILE *fp_out = NULL;
    if( NULL == (fp_out = fopen( argv[2], "w") ) )
    { // then fopen failed
        fprintf( stderr, "fopen for output file: %s failed due to %s\n", argv[2], strerror(errno) );
        fclose( fp_in ); // cleanup
        exit( EXIT_FAILURE );
    }

    // implied else, fopen output file successful

    source_to_destination( fp_in, fp_out );
    fclose( fp_in );
    fclose( fp_out );
    return 0;
} // end function: main


void source_to_destination(FILE *source , FILE *destination)
{
    char line[ MAX_LINE_LENGTH ];

    while(fgets(line,sizeof(line),source) )
    {
        if( EOF == fputs(line,destination) )
        { // then fputs failed
            fprintf( stderr,  "fputs to output file failed due to %s\n", strerror(errno) );
            fclose( source );
            fclose( destination );
            exit( EXIT_FAILURE );
        }
    }
} // end function: source_to_destination

它对我有用

答案 3 :(得分:0)

与SafiS的回答略有不同:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setHasOptionsMenu(true);
}

@Override
public View onCreateView(...) {
    View view = ...

    setMenuVisibility(true);

    return view;
}

@Override
public void onDestroyView() {
    setMenuVisibility(false);

    super.onDestroyView();
}

答案 4 :(得分:-1)

setRetainInstance(true)的片段中添加setHasOptionMenu(true)onCreate()