gpt4 book ai didi

android - 从 SherlockActionBar fragment 选项卡动态添加菜单项

转载 作者:太空宇宙 更新时间:2023-11-03 12:59:44 25 4
gpt4 key购买 nike

所以我一直在开发 Android 应用程序,它的顶部有一个带有多个选项卡的导航栏,这部分工作正常,但现在我希望能够从不同的 fragment 动态地将菜单项添加到操作栏(因为某些 fragment 可能有不同的可用选项)。到目前为止,无论我尝试了什么,我似乎都无法调用 onCreateOptionsMenu。这是我目前所拥有的

//First I have a holder class that is used to navigate between the different Fragment Tabs
public class ActionHolder extends SherlockFragmentActivity implements ActionBar.TabListener {....
//And then I have this method for switching Fragments based on what Tab is selected
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
int selectedTab = tab.getPosition();

if (selectedTab == 0) {
SalesMainScreen salesScreen = new SalesMainScreen();
ft.replace(R.id.content, salesScreen);
}
else if (selectedTab == 1) {
ClientMainScreen clientScreen = new ClientMainScreen();
ft.replace(R.id.content, clientScreen);
}.....

现在这里是选项卡的 fragment 之一(SalesMainScreen),我想将一些菜单项添加到操作栏

 @Override
public void onCreate (Bundle savedInstanceState) {
Log.i("message","the oncreate method was called");
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) {
return inflater.inflate(R.layout.salesmainscreen, group, false);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.i("message", "the oncreatemenu method called");
inflater.inflate(R.menu.menu_refresh, menu);
super.onCreateOptionsMenu(menu, inflater);
}

我看到调用了 OnCreate Log 消息,但根本没有看到调用了 onCreateOptionsMenu Log 消息。另外,我知道有时导入会导致问题,但是当我导入 Sherlock Menu 和 Menu Inflater 时,我在 OnCreateOptionMenu 方法上收到关于它们不兼容的各种错误消息。在此设置中是否可以将菜单项动态添加到操作栏,或者我应该只添加项目然后不对不适用于正在显示的 fragment 的项目执行任何操作?

最佳答案

我有一个使用 SherlockActionBar 和选项卡的应用程序,每个选项卡都包含一个 SherlockFragment。主 Activity 在操作栏中有自己的菜单,其中一个 fragment 将搜索项添加到操作栏菜单。

主要 Activity 有以下内容:

class MainActivity extends SherlockFragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
ActionBar bar = getSupportActionBar();
bar.addTab(createThingOneTab());
bar.addTab(createThingTwoTab());
bar.addTab(createThingThreeTab());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
}

}

选项卡中的 fragment 具有以下内容:

class ThingOneFragment extends SherlockFragment {

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

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
MenuItem search = menu.add("Search");
search.setIcon(android.R.drawable.ic_menu_search);
search.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
...
}

}

当我启动主要 Activity 时,该选项卡默认显示 ThingOneFragment 并且我在操作栏中看到搜索图标。当我选择其他选项卡时,搜索图标消失了。您确实需要确保您正在为 MenuMenuInflater 等使用 Sherlock 类。

我不确定它是否有所不同,但我的 TabListener 看起来像这样:

private TabListener createTabListener(final Class<? extends Fragment> clazz) {
return new TabListener() {

private Fragment mFragment;

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// no action
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mFragment == null) {
mFragment = Fragment.instantiate(activity, clazz.getName());
}
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, mFragment)
.commit();
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// no action
}
};

我不确定这是否会导致您的问题,或者这是否是处理标签的正确方式,但为了完整起见,我将其包括在内。

关于android - 从 SherlockActionBar fragment 选项卡动态添加菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13596113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com