Loader在Activity的onCreateOptionsMenu之前调用onLoadFinished

时间:2012-09-25 18:27:49

标签: android

当从活动的AsynctaskLoader启动OnCreate()时,它会完成其工作并在操作栏菜单膨胀之前调用onLoaderFinished(),即在onCreateOptionsMenu()被调用之前。

我需要根据加载器的结果更改一些操作菜单项。什么方法可以解决这个问题?

更新: 方向改变时会发生这种情况我在调试器中观察这个序列:

  1. 申请开始:onCreate() - > onCreateOptionsMenu() - > onLoadFinished()
  2. 旋转至横向:onCreate() - > onLoadFinished() - > onCreateOptionsMenu()
  3. 向后旋转至肖像:onCreate() - > onLoadFinished() - > onCreateOptionsMenu()

3 个答案:

答案 0 :(得分:2)

我尝试在shareActionProvider.setShareIntent()中调用onLoadFinished()时遇到了相同的情况,该onCreateOptionsMenu()依赖于public class myFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { ... private ShareActionProvider shareActionProvider; private Intent shareIntent; ... 中的shareActionProvider。

我的解决方案是将我的Intent和ShareActionProvider扩展到Fragment,然后在每个方法中初始化相应的字段并设置另一个(如果已经定义)。这样,无论在不使菜单无效的情况下首先调用哪一个,它都可以工作。

这基本上就是它的样子

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_my_fragment, menu);

    MenuItem menuItem = menu.findItem(R.id.action_share);
    shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);
    //in the case where onLoadFinished is called first, simply set the share intent here.
    if (null != shareIntent)
    {
        shareActionProvider.setShareIntent(shareIntent);
    }
}

onCreateOptionsMenu()

@Override
public void onLoadFinished(android.support.v4.content.Loader<Cursor> loader, Cursor data) {

    ... <get some data from cursor> ...

    shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
    shareIntent.setType("text/plain");
    shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_text)+data);

    //shareActionProvider may be null due to onLoadFinished called before onCreateOptionsMenu
    if (null != shareActionProvider)
    {
        shareActionProvider.setShareIntent(shareIntent);
    }

onLoadFinished()

studentFile=$1

答案 1 :(得分:1)

  

我需要根据加载器的结果更改一些操作菜单项。什么方法可以解决这个问题?

你的场景#2和#3应该对你完全没问题。在调用onCreateOptionsMenu()时,您拥有Cursor中的Loader(或其他内容),并可以定制您在onCreateOptionsMenu()中执行的操作。

关于方案#1,让onCreateOptionsMenu()做最有可能的事情,如果您在onLoadFinished()中确定这是不正确的,请致电invalidateOptionsMenu()以强制再次拨打{{ 1}},我想。

答案 2 :(得分:0)

这种特殊方法可以避免整个菜单无效。

根据加载器结果的结果为要控制的每个项目定义一个布尔标志和一个MenuItem变量:

假设您希望仅在加载程序返回任何成功时启用 New 操作:

private boolean mEnableNew = false;
private MenuItem mItemNew;

创建菜单时将菜单项保存到变量,同时应用状态:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.manage_menu, menu);

  mItemNew = menu.findItem(R.id.itm__manage_menu__new);
  mItemNew.setEnabled(mEnableNew);

  return super.onCreateOptionsMenu(menu);
}

最后,根据Loader的结果获取新设置,并启用禁用菜单项:

@Override
public void onLoadFinished(Loader<BI_Result> loader, Result result) {

    //--If onCreateOptionsMenu is not yet executed,it will use this boolean value when it does
    mEnableNew = result.isSuccess(); 

    //--If onCreateOptionsMenu has executed, we apply state here
    if (mItemNew != null) {
        mItemNew.setEnabled(mEnableNew);
    }
}