兩個月前我發佈了一個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」``用於或不用於菜單項不會影響問題。
嗨!感謝您的回覆,但這不是解決方案。雖然這段代碼沒有包含在我發佈的摘錄中,但它包含在原始代碼中。如果這將成爲問題的根源,則很難解釋爲什麼菜單項在其他版本中可見,或者第一次訪問碎片時。我將編輯我的帖子以清楚地說明。感謝提示。任何其他想法? – 2014-12-02 14:59:50
你找到這個[問題](https://code.google.com/p/android/issues/detail?id=29472)? – imort 2014-12-02 15:06:10
順便說一下,你的代碼從構造函數中調用setHasOptionMenu(),而不是onCreate()。 – imort 2014-12-02 15:18:24