我正在我的应用中实施应用内结算服务。我在onCreate()
中设置了对IabHelper.queryInventoryAsync()
的调用以检索以前的购买。如果购买了该项,我将全局布尔变量设置为true。同时,在onCreateOptionsMenu()
中,我检查该变量是否删除MenuItem。我的问题是onCreateOptionsMenu()
,正如预期的那样,有时在异步任务完成之前调用我的布尔变量。我需要一个解决方案告诉onCreateOptionsMenu()
等待该任务设置布尔值,以便它可以相应地创建菜单。这是详细的代码:
@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);
}
答案 0 :(得分:3)
我发现最有效的方法是使整个菜单无效。因此,当您获得异步结果时(在onQueryInventoryFinished
中),只需调用:
invalidateOptionsMenu();
或者,如果您使用FragmentActivity
(SherlockFragmentActivity
或ActionBarActivity
)
supportInvalidateOptionsMenu();
通过这种方式,菜单将被重新创建,您可以根据需要安全地添加或删除项目。
答案 1 :(得分:0)
也许使用onPrepareOptionMenu
可能会成功。文档(http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu%28android.view.Menu%29)声明它用于准备应该显示的内容。您将xml膨胀保留在onCreateOptionsMenu
中,然后执行以下操作:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_remove_ads).setVisible(!isNoAds);
return super.onPrepareOptionsMenu(menu);
}
您仍然会在isNoAds
方法中将onCreate
变量初始化为true,以确保它不会立即显示。