我正在使用从FragmentActivity派生的MainActivity,其中Fragments代表每个选项卡
在ActionBar中。从http://developer.android.com/guide/topics/ui/actionbar.html处的文档中,我实现了一个拆分的ActionBar,顶部带有选项卡,而其余的Action Items位于ActionBar的底部。
由于每个选项卡的“片段”都有各自特定的“操作项”,因此在调用“片段”时会加载代表这些“操作”的菜单。
总的来说,这是可行的。但是,操作项始终会显示在ActionBar底部的“溢出”菜单中,即使还有足够的空间。实际上,没有可见的项目或文本占用空间。

我正在使用支持v4库。

主要活动

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>


结果截图

最佳答案

您正在使用本机操作栏,如您从FragmentActivity而不是ActionBarActivity继承的事实所示。因此,myfirstapp:showAsAction将被忽略。将android:showAsAction用于本机操作栏。

如果打算将appcompat-v7用于操作栏回传,则将您的类更改为继承自ActionBarActivity,而不是FragmentActivity

10-07 13:59
查看更多