首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从异步任务接收数据后编辑“选项”菜单

从异步任务接收数据后编辑“选项”菜单
EN

Stack Overflow用户
提问于 2014-02-16 13:43:44
回答 2查看 715关注 0票数 3

我正在我的应用程序中实现应用程序计费服务。我在onCreate()中设置了对IabHelper.queryInventoryAsync()的调用,以检索以前的采购。如果购买了该项目,则将全局布尔变量设置为true。同时,在onCreateOptionsMenu()中,我检查该变量是否删除MenuItem。我的问题是,在异步任务完成之前,有时会像预期的那样调用onCreateOptionsMenu(),从而设置我的布尔变量。我需要一个解决方案来告诉onCreateOptionsMenu()等待该任务设置布尔值,以便它能够相应地创建菜单。下面是详细的代码:

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {  

//other  stuff...

   helper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener() {
                public void onQueryInventoryFinished(IabResult result,
                                                     Inventory inventory) {

                    if (result.isFailure()) {
                        // handle error here   
                        return;                        
                    }

                    if (inventory.hasPurchase(REMOVE_ADS_SKU)) {  
                        //item purchased. set control variable
                        isNoAds = true;
                    } 

                }
            });
}

@Override
public boolean onCreateOptionsMenu(final Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);

    //if the control variable is true, remove the option to buy ad-free version
    if (isNoAds) menu.removeItem(R.id.action_remove_ads);

    return super.onCreateOptionsMenu(menu);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-16 13:54:15

我发现最健壮的方法是使整个菜单无效。因此,当您获得异步结果(在onQueryInventoryFinished中)时,只需调用:

代码语言:javascript
复制
invalidateOptionsMenu();

或者,如果您使用的是FragmentActivity (SherlockFragmentActivityActionBarActivity)

代码语言:javascript
复制
supportInvalidateOptionsMenu();

这样,菜单将被重新创建,您可以安全地添加或删除您需要的项目。

票数 4
EN

Stack Overflow用户

发布于 2014-02-16 14:12:37

也许使用onPrepareOptionMenu可以做到这一点。docs (http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu%28android.view.Menu%29)声明它用于准备应该显示的内容。在onCreateOptionsMenu中保持xml膨胀,然后执行以下操作:

代码语言:javascript
复制
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_remove_ads).setVisible(!isNoAds);
    return super.onPrepareOptionsMenu(menu);
}

您仍然将isNoAds变量初始化为onCreate方法中的true,以确保它不会立即显示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21811947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档