Android 基于片段条件的菜单显示/隐藏

Android 基于片段条件的菜单显示/隐藏,android,menu,android-actionbar,Android,Menu,Android Actionbar,我有一个片段在适配器的帮助下显示列表。在列表中有一个链接单击,用户在其中调用另一个调用适配器以获取数据的活动。获取数据后,我们可以添加ata并保存在该适配器中,这会将用户定向到片段1以保存数据 .最初,我不希望菜单保存在fragment1中。一旦用户在列表的一次单击中添加数据,ehich将打开另一个列表添加数据并返回fragment1,然后我需要显示菜单保存…我已尝试过 @Override public void onCreate(@Nullable Bundle savedInstanceSt

我有一个片段在适配器的帮助下显示列表。在列表中有一个链接单击,用户在其中调用另一个调用适配器以获取数据的活动。获取数据后,我们可以添加ata并保存在该适配器中,这会将用户定向到片段1以保存数据

.最初,我不希望菜单保存在fragment1中。一旦用户在列表的一次单击中添加数据,ehich将打开另一个列表添加数据并返回fragment1,然后我需要显示菜单保存…我已尝试过

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


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.action_save, menu);
    shareItem = menu.findItem(R.id.action_save1);
    shareItem.setVisible(false);

}


 later based on condition i am doing   shareItem.setVisible(true);

在片段中,重写
onPrepareOptions菜单()
,并根据您的条件隐藏该项

 @Override
public void onPrepareOptionsMenu(Menu menu) {
    MenuItem item=menu.findItem(R.id.action_save1);
    item.setVisible(false);
    super.onPrepareOptionsMenu(menu);
}
还要确保调用
设置选项菜单(true)
onCreate()中

boolean on prepareOptions功能表(菜单菜单)
准备屏幕标准 要显示的选项菜单。这在菜单打开之前调用 显示,每次显示时。您可以使用此方法高效地 启用/禁用项目或以其他方式动态修改内容


在“活动”中将布尔变量添加为字段
isShareItemVisible=true
,然后在条件更改时将其设置为
false
并调用
InvalidateOptions菜单()。在
onCreateOptions菜单中
方法使用此变量,即:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.action_save, menu);
    shareItem = menu.findItem(R.id.action_save1);
    shareItem.setVisible(isShareItemVisible);
}

在打开另一个列表之前,您可以将布尔值设置为true,当您再次返回fragment1时,将调用
setUserVisibleHint()
方法,您可以检查布尔值和
isVisibleToUser
变量值。如果两者均为真,则可以看到菜单项

@Override  
public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
}
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1001) {
            Fragment fragment1 = (Fragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
            if (fragment1 != null) {
                fragment1 .onActivityResult(requestCode, resultCode, data);
            }
        }
    }
或者,如果您正在打开另一个获取数据的活动,则可以使用
startActivityForResult()
方法。当您将数据发送回“活动”时。将调用activityResult()上的
。您可以从中检查
requestCode
和所有片段
startActivityForResult()
方法。从中可以设置菜单项

@Override  
public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
}
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1001) {
            Fragment fragment1 = (Fragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
            if (fragment1 != null) {
                fragment1 .onActivityResult(requestCode, resultCode, data);
            }
        }
    }

当您为结果启动另一个活动时,可以使用
startActivityForResult()
。获取数据后,可以启用菜单。 在这里你可以得到更多的信息

例如,启动“活动”时,设置示例1的结果代码。然后在获得活动数据后,按照这种方式完成第二个活动

Intent returnIntent = new Intent();
setResult(Activity.RESULT_OK,returnIntent);
finish();
在您的
onActivityResult
中,您可以检查结果是否正常,然后启用菜单

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == 1) {
            if(resultCode == Activity.RESULT_OK){
               //data is updated. 
             myitem.setvisiblity(true)
            }        
        }
    }

你得到了什么?另一个列表是否向你的片段返回了一些值1??是的,它返回了object我只在活动结果上使用此方法,我正在检查添加的id数据=0表示然后设置Visibity(真);但不起作用我正在使用startactivity为reult启动活动,我说的是像myitem.setvisiblity(true);但是不起作用。是否从
onActivityResult()
方法设置可见性?如果(nestedhashmap.linkgarmentdata!=null){shareItem.setVisible(true),则设置可见性;检查
nestedhashmap.linkgarmentdata
onActivityResult()是否可以共享
onActivityResult()的代码
method?不,它不是空的。如果我调试,我得到的大小是1。