Android 活动与片段之间的相互作用

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

在我的应用程序中,主活动承载两个片段,并作为ActionBarTabs附加到activity。使用以下代码注意:活动和2个片段在单独的xml布局文件中定义(参见底部的图片)

现在来谈谈我的问题:

  • 我想在应用程序加载时更新状态片段上显示的数据,片段恢复并从操作栏单击刷新菜单项。现在,当我尝试使用以下代码从主活动访问状态片段时

    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_服务(它显示为仅用于此模型的开始按钮)作为启动或停止后台服务的切换。我可以通过onOptionsItemSelected方法轻松更新开始菜单项的标题/图标(我在共享首选项中保存当前状态running/stoppede)。但是,当我尝试通过使用访问活动的onStart/onResume菜单项时

     MenuItem mi = (MenuItem) findViewById (R.id.action_service);
    
  • 它总是返回null。因此,我如何访问onResume/onStart中的action\u 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()。因此,即使我正在捕获刷新操作栏项并单击主活动,我也无法调用刷新方法。。。你能为这个建议些什么吗?