Actionbar项始终显示在溢出菜单中

时间:2015-01-04 15:54:05

标签: android android-fragments android-actionbar-compat splitactionbar

我正在使用从FragmentActivity派生的MainActivity,其中Fragments代表每个标签 在ActionBar中。在http://developer.android.com/guide/topics/ui/actionbar.html的文档中,我实现了一个拆分ActionBar,其中顶部有选项卡,ActionBar底部有剩余的Action Items。 因为每个选项卡的Fragment都有自己特定的Action Items,所以在调用Fragment时会加载一个表示这些Actions的菜单。 这一般起作用。但是,Action Items始终显示在ActionBar底部的Overflow菜单中,即使剩下足够的空间。实际上,没有可见的项目或文本占用空间。

我正在使用支持v4库。

MainActivity

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
TabNavigatorPagerAdapter tabNavigatorPagerAdapter;
ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Create the adapter that will return a fragment for each of the three primary sections
    // of the app
    tabNavigatorPagerAdapter = new TabNavigatorPagerAdapter(getSupportFragmentManager());

    // Set up the action bar
    final ActionBar actionBar = getActionBar();

    // Specify that the Home/Up button should not be enabled, since there is no hierarchical
    // parent
    actionBar.setHomeButtonEnabled(false);

    //force tabs at top and actions at bottom
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowTitleEnabled(false);

    // Specify that we will be displaying tabs in the action bar
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // Set up the ViewPager, attaching the adapter and setting up a listener for when the
    // user swipes between sections
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(tabNavigatorPagerAdapter);
    viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            // When swiping between different app sections, select the corresponding tab
            // We can also use the ActionBar.Tab#select() to do this if we have a reference
            // to the Tab
            actionBar.setSelectedNavigationItem(position);
        }
    });

    // For each of the sections in the app, add a tab to the action bar.

    // Add Calendar activity
    actionBar.addTab(actionBar.newTab().setText(R.string.calendar_activity).setTabListener(this));
    // Add Grocery List activity
    actionBar.addTab(actionBar.newTab().setText(R.string.grocery_list_activity).setTabListener(this));
    // Add Search activity
    actionBar.addTab(actionBar.newTab().setText(R.string.search_activity).setTabListener(this));
}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    // When the given tab is selected, switch to the corresponding page in the ViewPager.
    viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}

public static class TabNavigatorPagerAdapter extends FragmentPagerAdapter {
    public TabNavigatorPagerAdapter(android.support.v4.app.FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        switch (i) {
            case 0:
                // This is the Calendar section of the App
                return new CalendarFragment();
            default:
                // The other sections of the app are dummy placeholders
                Fragment fragment = new DummySectionFragment();
                Bundle args = new Bundle();
                args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, i + 1);
                fragment.setArguments(args);
                return fragment;
        }
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "Section " + (position + 1);
    }
}

// The Calendar fragment
public static class CalendarFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_calendar, container, false);
        Bundle args = getArguments();
        ((TextView)  rootView.findViewById(android.R.id.text1)).setText(R.string.calendar_activity);
        setHasOptionsMenu(true);

        return rootView;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        inflater.inflate(R.menu.menu_calendar, menu);
    }
}
}

清单

<?xml version="1.0" encoding="utf-8"?>

<uses-sdk android:minSdkVersion="11" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Holo.Light.DarkActionBar">

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:uiOptions="splitActionBarWhenNarrow">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <meta-data android:name="android.support.UI_OPTIONS"
            android:value="splitActionBarWhenNarrow"/>
    </activity>
    <activity
        android:name=".CollectionDemoActivity"
        android:label="@string/demo_collection">

    </activity>
</application>

日历菜单xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myfirstapp="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.kikicorp.myfirstapp.MainActivity">
<item
    android:id="@+id/qwe"
    android:icon="@drawable/ic_launcher"
    myfirstapp:showAsAction="ifRoom"
    android:title="qwe">
</item>
<item
    android:id="@+id/ee"
    android:icon="@drawable/ic_action_edit"
    myfirstapp:showAsAction="ifRoom"
    android:title="edit">
</item>
<item
    android:id="@+id/xx"
    android:icon="@drawable/ic_action_new"
    myfirstapp:showAsAction="ifRoom"
    android:title="new">
</item>
<item
    android:id="@+id/go_crazy"
    android:icon="@drawable/ic_action_search"
    myfirstapp:showAsAction="ifRoom"
    android:title="@string/go_crazy_action">
</item>
</menu>

结果截图

enter image description here

1 个答案:

答案 0 :(得分:1)

您正在使用原生操作栏,因为您继承自FragmentActivity,而不是ActionBarActivity。因此,myfirstapp:showAsAction将被忽略。使用android:showAsAction作为原生操作栏。

如果您打算将appcompat-v7用于操作栏backport,请将您的课程更改为继承ActionBarActivity,而不是FragmentActivity