【问题标题】:Interaction between Activity and FragmentsActivity 和 Fragments 之间的交互
【发布时间】:2013-07-17 15:11:49
【问题描述】:

在我的应用程序中,主要活动托管两个片段并作为 ActionBarTabs 附加到活动。使用以下代码。 注意:activity 和 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);
    

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

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

【问题讨论】:

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


    【解决方案1】:

    首先如果你想声明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;
    }
    

    关于在应用程序加载或Activity 启动时更新您的Fragment,只需设置选择包含Fragment 的选项卡,然后将加载数据的代码放在Fragment 上它的onStart()onActivityCreated() 方法。您可以在您的Fragment 中覆盖onOptionsItemSelected(),因此您可以更新您的视图,而不是从包含您的FragmentActivity,而是从它自己的类。

    编辑:这是一个如何处理来自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);
        }
    }
    

    使用它,您可以在您的Fragment 中添加和使用MenuItem

    希望这会有所帮助!

    【讨论】:

    • 我将刷新功能放在 [StatusFragment] 中,并从 onStart 方法中调用它,它工作正常。但是由于 onCreateOptionsMenu 是在 Main Activity 上调用的,所以 onOptionsItemSelected() 不会为 Fragment 触发。因此,即使我在主活动上捕获了刷新操作栏项目,我也无法调用刷新方法......你能为此提出任何建议吗?
    【解决方案2】:

    我可以回答 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 2012-09-06
      • 2016-11-11
      • 2016-05-15
      相关资源
      最近更新 更多