ActionBar菜单项在某些Android 4.1.2设备上不可见

时间:2014-12-02 14:33:22

标签: android android-fragments menu android-actionbar

两个月前,我发布了一个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”``用于或不用于菜单项不会影响问题。

1 个答案:

答案 0 :(得分:0)

好像你错过了片段onCreate()中的电话setHasOptionsMenu

请参阅此guide