Android 活动与片段之间的相互作用
在我的应用程序中,主活动承载两个片段,并作为ActionBarTabs附加到activity。使用以下代码注意:活动和2个片段在单独的xml布局文件中定义(参见底部的图片) 现在来谈谈我的问题:Android 活动与片段之间的相互作用,android,android-fragments,android-activity,android-actionbar,Android,Android Fragments,Android Activity,Android Actionbar,在我的应用程序中,主活动承载两个片段,并作为ActionBarTabs附加到activity。使用以下代码注意:活动和2个片段在单独的xml布局文件中定义(参见底部的图片) 现在来谈谈我的问题: 我想在应用程序加载时更新状态片段上显示的数据,片段恢复并从操作栏单击刷新菜单项。现在,当我尝试使用以下代码从主活动访问状态片段时 SFrag frag = (SFrag) getFragmentManager().findFragmentById(R.id.st_frag); Log.d(TA
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);
}
MenuItem mi = (MenuItem) findViewById (R.id.action_service);
我的应用程序看起来像这样我可以回答菜单项部分,但不能回答其他部分 对于符合文档
的菜单项,您可以安全地保留菜单(以及由此创建的任何项目),根据需要对其进行修改,直到下次调用onCreateOptions菜单()。
比如说
@Override
public boolean onCreateOptionsMenu(Menu menu) {
actionMenu = menu;
return true;
}
所以基本上,只要你想改变其中一项,你就可以这样做
MenuItem item = actionMenu.getItem(0);
我能回答菜单项的部分,但不能回答其他部分 对于符合文档
的菜单项,您可以安全地保留菜单(以及由此创建的任何项目),根据需要对其进行修改,直到下次调用onCreateOptions菜单()。
比如说
@Override
public boolean onCreateOptionsMenu(Menu menu) {
actionMenu = menu;
return true;
}
所以基本上,只要你想改变其中一项,你就可以这样做
MenuItem item = actionMenu.getItem(0);
首先,如果您想声明
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;
}
关于在应用程序加载或活动开始时更新片段
,只需设置保存片段
的所选选项卡,并将加载片段
中数据的代码放在启动()或激活创建()方法上。您可以在片段
中重写onOptionsItemSelected()
,这样您就可以不从保存片段的活动
更新视图,而是从它自己的类更新视图
编辑:下面是一个示例,您应该如何处理片段中的菜单:
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
,您应该这样做:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.main_activity, menu);
MenuItem mRefresh = menu.findItem(R.id.refresh_menu_item);
return true;
}
关于在应用程序加载或活动开始时更新片段
,只需设置保存片段
的所选选项卡,并将加载片段
中数据的代码放在启动()或激活创建()方法上。您可以在片段
中重写onOptionsItemSelected()
,这样您就可以不从保存片段的活动
更新视图,而是从它自己的类更新视图
编辑:下面是一个示例,您应该如何处理片段中的菜单:
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);
}
}
使用此选项,您可以在片段中添加并使用菜单项
希望这有帮助 我将我的刷新功能放在[StatusFragment]中,并从onStart方法调用它,它工作正常。但是由于OnCreateOptions菜单是在主活动上调用的,因此不会为片段触发OnOptions ItemSelected()。因此,即使我正在捕获刷新操作栏项并单击主活动,我也无法调用刷新方法。。。你能给我建议一个解决方案吗?我把我的刷新功能放在[StatusFragment]中,并从onStart方法调用它,它工作得很好。但是由于OnCreateOptions菜单是在主活动上调用的,因此不会为片段触发OnOptions ItemSelected()。因此,即使我正在捕获刷新操作栏项并单击主活动,我也无法调用刷新方法。。。你能为这个建议些什么吗?