活动与碎片之间的相互作用

时间:2013-07-17 15:11:50

标签: android android-fragments android-activity android-actionbar

在我的应用程序中,主活动包含两个片段并作为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;
}

现在回答我的问题:

  1. 我想在应用程序加载,片段恢复和操作栏中单击刷新菜单项时更新状态片段上显示的数据。现在,当我尝试使用以下代码从主活动访问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);
        }
    
  2. getFragmentManager()。findFragmentById 方法始终返回null。我甚至尝试了活动的onResume方法,片段对象仍然返回为null。那么我如何访问片段,从而从主机acticty访问该片段的方法。

    1. 其次,我尝试在操作栏中使用action_service(仅显示为此模型的“开始”按钮)作为用于satrting或停止后台服务的切换。我可以从 onOptionsItemSelected 方法轻松更新开始菜单项的标题/图标(我在shared-preferences中保存当前状态running / stoppede)。但是当我尝试使用

      在活动的onStart / onResume上加入menuItem时
       MenuItem mi = (MenuItem) findViewById (R.id.action_service);
      
    2. 它总是返回null。那么如何访问onResume / onStart中的action_service菜单项来更新它。

      我的应用程序看起来像My application's mockup

2 个答案:

答案 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);