两个月前,我发布了一个Android应用v14作为MinSDKVersion,v19发布为TargetSDKVersion。一切正常,除了一些用户报告ActionBar菜单项的问题:
它们在第一个应用程序启动时显示,但在第一次切换到选项卡时消失。
应用程序的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;
}
}
我找到了几个处理ActionBar项目问题的条目,但它们都引用了4.0之前基础SDK较低的应用程序。它看到在使用硬件菜单按钮ActionBar菜单转换应用程序时出现了问题。由于我的应用程序支持SDK 14+,因此在我的情况下这不是解决方案。
用户日志显示,调用了片段的onCreateOptionsMenu
方法,并且正确填充了菜单。那么为什么菜单项没有正确显示?
相同的代码在浪费大多数设备上没有任何问题,只有少数用户受到影响。据我所知,他们都使用Android 4.1.2。除此之外,我看不出设备等方面的任何相似之处。
知道如何解决这个问题吗?
PS:更好的`android:showAsAction =“always”``用于或不用于菜单项不会影响问题。