2

我使用支持库V7中的ActionBarActivity。 但是,当我在菜单xml中指定android:showAsAction =“always”时,它不起作用。我必须在方法onCreateOptionsMenu()中的Java代码中执行此操作,以查找该项目并手动设置属性。我的代码有什么问题吗?为什么会发生?android:showAsAction =“always”不适用于标签片段

这里是我的活动代码,从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> 

回答

10

问题解决了,感谢张贴在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框架中不存在,因此支持库。因此,您必须使用自己的名称空间作为支持库定义的所有属性的前缀。

0

我的问题与此代码解决: 我修改android:showAsAction="always"app:showAsAction="always",我的问题就解决了

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/action_add_projects" 
     app:showAsAction="always" 
     android:icon="@drawable/ic_action_add_project" 
     android:title="@string/add_project" /> 
</menu>