2014-12-02 182 views
2

兩個月前我發佈了一個Android應用程序V14爲的minSdkVersion和V19作爲TargetSDKVersion。一切工作正常,除了一些用戶報告ActionBar菜單項的問題:動作條菜單項

它們顯示在第一個應用程序的開始,但第一次切換離開標籤時消失。

在App的在MainActivity延伸FragmentActivity和使用的ActionBar標籤3個不同的頁面(片段)之間進行切換:

public class MainActivity extends FragmentActivity { 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
     viewPager = (ViewPager)findViewById(R.id.pager); 
     viewPager.setAdapter(sectionsPagerAdapter); 

     viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       getActionBar().setSelectedNavigationItem(position); 
      } 
     }); 

     ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setHomeButtonEnabled(true); 

     ActionBar.TabListener tabListener = new ActionBar.TabListener() { 
      public void onTabSelected(Tab tab, android.app.FragmentTransaction arg1) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      public void onTabReselected(Tab arg0, android.app.FragmentTransaction arg1) { } 
      public void onTabUnselected(Tab arg0, android.app.FragmentTransaction arg1) { } 
     }; 

     actionBar.addTab(actionBar.newTab() 
       .setText(R.string.LOC_Common_Overview) 
       .setTabListener(tabListener)); 
     actionBar.addTab(actionBar.newTab() 
       .setText(R.string.LOC_Contacts) 
       .setTabListener(tabListener)); 
     actionBar.addTab(actionBar.newTab() 
       .setText(R.string.LOC_Messages) 
       .setTabListener(tabListener)); 

     ... 
    } 
} 

菜單文件的一個例子:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:id="@+id/contacts_action_add" 
     android:icon="@drawable/image__white__plus" 
     android:showAsAction="always" 
     android:title="@string/LOC_Create"> 
     <menu> 
      <item 
       android:id="@+id/contacts_action_add_entry" 
       android:icon="@drawable/image__white__person" 
       android:showAsAction="always" 
       android:title="@string/LOC_Contact"/> 
      <item 
       android:id="@+id/contacts_action_add_group" 
       android:icon="@drawable/image__white__persons" 
       android:showAsAction="always" 
       android:title="@string/LOC_Group"/> 
     </menu> 
    </item> 
</menu> 

的一個例子,碎片:

public class ContactsFragment extends Fragment { 
    public ContactsFragment() { 
     super(); 
     setHasOptionsMenu(true); 
    } 

    ... 
    private Menu optionsMenu; 
    private MenuItem addEntryMenuItem; 
    private MenuItem addGroupMenuItem; 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     Log.d("ContactsFragment: onCreateOptionsMenu"); 
     inflater.inflate(R.menu.menu_main__contacts, menu); 
     optionsMenu = menu; 

     if (optionsMenu != null) { 
      Log.d("ContactsFragment: onCreateOptionsMenu - optionsMenu != null"); 
      addEntryMenuItem= optionsMenu.findItem(R.id.contacts_action_add_entry); 
      addGroupMenuItem= optionsMenu.findItem(R.id.contacts_action_add_group); 
     } 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     Log.d("ContactsFragment: onOptionsItemSelected"); 
     if (item == addEntryMenuItem) { 
      ... 
      return true; 
     } else if (item == addGroupMenuItem) { 
      ... 
      return true; 
     } 

     return false; 
    } 
} 

我發現了幾個條目, al與ActionBar項目的問題,但他們都參考4.0以下的基礎SDK較低的應用程序。它看到從使用硬件菜單按鈕ActionBar菜單轉換應用程序時出現問題。由於我的應用程序只支持SDK 14+,所以這不能成爲我的解決方案。

用戶日誌顯示,該片段的onCreateOptionsMenu方法被調用,並且菜單正確地膨脹。那爲什麼菜單項不能正確顯示?

相同的代碼工作,而不在浪費廣大設備中的任何問題,只有少數用戶的影響。據我所知,他們都使用Android 4.1.2。除此之外,我無法在設備中看到任何相似之處等。

任何想法如何解決此問題?

PS:Wether`android:showAsAction =「always」``用於或不用於菜單項不會影響問題。

回答

0

好像你已經錯過了你的片段中的onCreate調用setHasOptionsMenu()

看到這個guide

+0

嗨!感謝您的回覆,但這不是解決方案。雖然這段代碼沒有包含在我發佈的摘錄中,但它包含在原始代碼中。如果這將成爲問題的根源,則很難解釋爲什麼菜單項在其他版本中可見,或者第一次訪問碎片時。我將編輯我的帖子以清楚地說明。感謝提示。任何其他想法? – 2014-12-02 14:59:50

+0

你找到這個[問題](https://code.google.com/p/android/issues/detail?id=29472)? – imort 2014-12-02 15:06:10

+0

順便說一下,你的代碼從構造函數中調用setHasOptionMenu(),而不是onCreate()。 – imort 2014-12-02 15:18:24