0

在我的应用程序中,主要活动托管两个片段并作为 ActionBarTabs 附加到活动。使用以下代码。注意:活动和 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. 我想在应用程序加载、片段恢复和单击操作栏中的刷新菜单项时更新状态片段上显示的数据。现在,当我尝试使用以下代码从 Main Activity 访问状态片段时

    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。那么我如何访问片段,从而从主机操作中访问该片段的方法。

  1. 其次,我正在尝试在操作栏中使用 action_service(仅针对此模型显示为“开始”按钮)作为切换或停止后台服务的开关。我可以从onOptionsItemSelected方法轻松更新开始菜单项的标题/图标(我将当前状态运行/停止保存在共享首选项中)。但是当我尝试通过使用在活动的 onStart/onResume 访问 menuItem

     MenuItem mi = (MenuItem) findViewById (R.id.action_service);
    

它总是返回 null。那么如何访问 onResume/onStart 中的 action_service 菜单项来更新它。

我的应用程序看起来像这样我的应用程序模型

4

2 回答 2

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的应用程序onStart()onActivityCreated()方法中。onOptionsItemSelected()您可以在您的中覆盖Fragment,因此您可以更新您的视图,而不是从您的Activity哪个持有您的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);
    }
}

使用它,您可以MenuItemFragment.

希望这可以帮助!

于 2013-07-17T15:20:05.390 回答
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);
于 2013-07-17T15:18:06.943 回答