2014-02-16 27 views
2

我正在應用程序中實施應用內結算服務。我在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); 
} 

回答

3

我發現,最強大的方法來做到這一點是通過使整個菜單無效。所以,當你得到你的異步結果(onQueryInventoryFinished)只要致電:

invalidateOptionsMenu(); 

,或者,如果您使用的是FragmentActivitySherlockFragmentActivityActionBarActivity

supportInvalidateOptionsMenu(); 

這樣的菜單將被重新創建並且您可以根據需要安全地添加或刪除項目。

+0

這似乎乾淨地解決了這個問題,因爲看起來invalidateOptionsMenu()不需要任何對菜單本身的引用,並且在菜單沒有調用時沒有明顯的異常風險由於該方法放置在onCreate()中,所以這是我的擔心。我確實想到了這個解決方案,但是我使用的是api 10,但我錯過了這個方法的兼容版本:)非常感謝! – devrocca

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方法,以確保它不會立刻顯示。

+0

我相信這是最直接的解決方案,但是如果菜單在顯示ui之後立即打開,當任務尚未設置變量時,MenuItem仍然可見。通常使用(沒有人通常會在打開應用程序後立即打開菜單),但這可能沒問題,但上面的解決方案似乎是最強大的。感謝您的回答! – devrocca

+0

您可以簡單地在onCreate方法中將isNoAds初始化爲true,這樣它就不會被視爲可見,並且您無需進一步處理。 – synapticvoid