android:showAsAction ="always"不适用于选项卡 fragment

标签 android android-actionbar android-menu android-actionbar-compat

我正在使用支持库 V7 中的 ActionBarActivity。 但是,当我在菜单 xml 中指定 android:showAsAction="always"时,它不会生效。我必须在 onCreateOptionsMenu() 方法中的 Java 代码中执行此操作,以找到项目并手动设置属性。我的代码有什么问题吗?为什么会这样?

这是我的 Activity 代码,大部分来自document sample :

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.setDisplayShowTitleEnabled(false);

        Tab tab = actionBar
                .newTab()
                .setText("ArtistFragment")
                .setIcon(android.R.drawable.ic_input_add)
                .setTabListener(
                        new TabListener<ArtistFragment>(this, "ArtistFragment", ArtistFragment.class));
        actionBar.addTab(tab);

        tab = actionBar
                .newTab()
                .setText("AlbumFragment")
                .setIcon(android.R.drawable.btn_radio)
                .setTabListener(
                        new TabListener<AlbumFragment>(this, "AlbumFragment", AlbumFragment.class));
        actionBar.addTab(tab);
    }

    public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
        private Fragment mFragment;
        private final Activity mActivity;
        private final String mTag;
        private final Class<T> mClass;

        /** Constructor used each time a new tab is created.
          * @param activity  The host Activity, used to instantiate the fragment
          * @param tag  The identifier tag for the fragment
          * @param clz  The fragment's Class, used to instantiate the fragment
          */
        public TabListener(Activity activity, String tag, Class<T> clz) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;
        }

        /* The following are each of the ActionBar.TabListener callbacks */

        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            // Check if the fragment is already initialized
            if (mFragment == null) {
                // If not, instantiate and add it to the activity
                mFragment = Fragment.instantiate(mActivity, mClass.getName());
                mFragment.setHasOptionsMenu(true); //MUST manually set here
                ft.add(android.R.id.content, mFragment, mTag);
            } else {
                // If it exists, simply attach it in order to show it
                ft.attach(mFragment);
            }
        }

        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            if (mFragment != null) {
                // Detach the fragment, because another one is being attached
                ft.detach(mFragment);
            }
        }

        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // User selected the already selected tab. Usually do nothing.
        }
    }

    public static class ArtistFragment extends Fragment {
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            super.onCreateOptionsMenu(menu, inflater);
            inflater.inflate(R.menu.menu1, menu);
            // Manually set will take effect
            menu.findItem(R.id.menu_item1)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        }
    }

    public static class AlbumFragment extends Fragment {
        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            super.onCreateOptionsMenu(menu, inflater);
            inflater.inflate(R.menu.menu2, menu);
            // XML set android:showAsAction="always" does not work
        }
    }
}

这是两个菜单 xml 文件:

menu1.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_item1"
        android:icon="@android:drawable/ic_menu_view"
        android:title="menu1"
        android:showAsAction="always"/>
</menu>

menu2.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/menu_item2"
        android:icon="@android:drawable/ic_menu_view"
        android:title="menu2"
        android:showAsAction="always"/>
</menu>

最佳答案

问题已解决,感谢发布在 THIS PAGE 上的答案

诀窍是我必须像这样修改我的菜单 xml 文件:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:mytest="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_item1"
        android:icon="@android:drawable/ic_media_ff"
        android:title="menu1"
        mytest:showAsAction="always"/>
</menu>

从官方文档中,有解释为什么这是必要的:

使用支持库中的 XML 属性

请注意,上面的 showAsAction 属性使用了标签中定义的自定义命名空间。当使用支持库定义的任何 XML 属性时,这是必需的,因为这些属性在旧设备上的 Android 框架中不存在。因此,您必须使用自己的命名空间作为支持库定义的所有属性的前缀。

关于android:showAsAction ="always"不适用于选项卡 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20726881/

相关文章:

java - 返回特定 Activity 而不重新开始它

android - 如何在这个新的 ICS 世界中添加 UI 选项卡?

Android - actionBar.setDisplayHomeAsUpEnabled 问题

android - 通过 XML 为 Android 矢量菜单图标着色

android - 您在哪里可以找到 Android 中信任管理器的默认实现?

Android Gradle : rename/disable default build type

android - 如何更改操作栏中的选项菜单图标?

android - 如何获取 Android 溢出菜单图标的副本?

java - android fragment 中的textview中不显示全文

java - NavigationDrawerFragment 不适用于 AppCompat 工具栏