操作栏项目总是出现在溢出菜单中
Actionbar items always appear in overflow menu
我正在使用从 FragmentActivity 派生的 MainActivity,Fragments 代表每个选项卡
在操作栏中。从 http://developer.android.com/guide/topics/ui/actionbar.html 的文档中,我实现了一个拆分 ActionBar,其中选项卡位于顶部,其余 Action Items 位于 ActionBar 的底部。
因为每个选项卡的 Fragment 都有自己特定的 Action Items,所以在调用 Fragment 时会加载代表这些 Actions 的菜单。
这通常有效。但是,Action Items 始终出现在 ActionBar 底部的溢出菜单中,即使它还剩下很多 space。实际上,没有可见项目或文本占用 space。
我正在使用支持 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
用于操作栏向后移植,请将您的 class 更改为继承自 ActionBarActivity
,而不是 FragmentActivity
。
我正在使用从 FragmentActivity 派生的 MainActivity,Fragments 代表每个选项卡 在操作栏中。从 http://developer.android.com/guide/topics/ui/actionbar.html 的文档中,我实现了一个拆分 ActionBar,其中选项卡位于顶部,其余 Action Items 位于 ActionBar 的底部。 因为每个选项卡的 Fragment 都有自己特定的 Action Items,所以在调用 Fragment 时会加载代表这些 Actions 的菜单。 这通常有效。但是,Action Items 始终出现在 ActionBar 底部的溢出菜单中,即使它还剩下很多 space。实际上,没有可见项目或文本占用 space。
我正在使用支持 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
用于操作栏向后移植,请将您的 class 更改为继承自 ActionBarActivity
,而不是 FragmentActivity
。