在我的应用程序中,主活动包含两个片段并作为ActionBarTabs附加到acticity。使用以下代码。 注意:活动和2个片段在单独的xml布局文件中定义(参见底部的图片)
private void createActionTabs() {
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//Status Tab
String strStatus = getResources().getString(R.string.lblStatus);
ActionBar.Tab statusTab = actionBar.newTab();
statusTab.setText(strStatus);
TabListener<SFrag> sFTabListener = new TabListener<SFrag>(this, strStatus, SFrag.class);
statusTab.setTabListener(sFTabListener);
actionBar.addTab(statusTab);
//Controller Tab attached the same way
.....
}
使用
添加ActionBar项目(启动和刷新) public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
现在回答我的问题:
我想在应用程序加载,片段恢复和操作栏中单击刷新菜单项时更新状态片段上显示的数据。现在,当我尝试使用以下代码从主活动访问Status片段时
SFrag frag = (SFrag) getFragmentManager().findFragmentById(R.id.st_frag);
Log.d(TAG, "In Activity SFrag is " + (frag == null ? "null" : "not null"));
if (frag != null) {
//calls the method to update data
fragment.updateStatusData(statusInformation);
}
getFragmentManager()。findFragmentById 方法始终返回null。我甚至尝试了活动的onResume方法,片段对象仍然返回为null。那么我如何访问片段,从而从主机acticty访问该片段的方法。
其次,我尝试在操作栏中使用action_service(仅显示为此模型的“开始”按钮)作为用于satrting或停止后台服务的切换。我可以从 onOptionsItemSelected 方法轻松更新开始菜单项的标题/图标(我在shared-preferences中保存当前状态running / stoppede)。但是当我尝试使用
在活动的onStart / onResume上加入menuItem时 MenuItem mi = (MenuItem) findViewById (R.id.action_service);
它总是返回null。那么如何访问onResume / onStart中的action_service菜单项来更新它。
我的应用程序看起来像
答案 0 :(得分:2)
首先,如果你想声明MenuItem
,你应该这样做:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.main_activity, menu);
MenuItem mRefresh = menu.findItem(R.id.refresh_menu_item);
return true;
}
关于更新Fragment
应用加载或Activity
的开始,只需设置选中包含Fragment
的标签,然后输入将加载数据的代码Fragment
1}}使用onStart()
或onActivityCreated()
方法。您可以覆盖onOptionsItemSelected()
中的Fragment
,这样您就可以更新自己的观看次数,而不是来自Activity
的{{1}},而是来自它自己的班级。
修改:以下是您应如何处理Fragment
菜单的示例:
Fragment
使用此功能,您可以在 public class MyFragment extends Fragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true); // Do not forget this!!!
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.first_fragment, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.action_refresh:
// Do You stuff here
break;
}
return super.onOptionsItemSelected(item);
}
}
中添加和使用MenuItem
。
希望这有帮助!
答案 1 :(得分:1)
我可以回答MenuItem部分而不是其他部分。
按照文档You can safely hold on to menu (and any items created from it), making modifications to it as desired, until the next time onCreateOptionsMenu() is called.
例如
@Override
public boolean onCreateOptionsMenu(Menu menu) {
actionMenu = menu;
return true;
}
所以基本上任何时候你想要改变其中一个项目就可以做到这一点
MenuItem item = actionMenu.getItem(0);