Android ActionBar详解
16lz
2021-01-23
ActionBar(活动栏)替代了显示在屏幕顶端的标题栏。主要负责显示菜单,widget,导航等功能,主要包括:
- 显示选项菜单中的菜单项到活动栏;
- 添加可交互的视图到活动栏作为活动视图;
- 使用应用的图标作为活动项,代表返回home或者向上等重要操作;
- 提供标签导航,方便不同的Fragment之间切换;
- 提供下拉导航功能。
一、添加Option Menu到活动栏
1、利用menu目录下的xml布局文件 1.1、xml布局文件:
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_search" android:actionViewClass="android.widget.SearchView" android:icon="@android:drawable/ic_menu_search" android:showAsAction="ifRoom" android:title="@string/menu_search"/> <item android:id="@+id/menu_edit" android:icon="@android:drawable/ic_menu_edit" android:showAsAction="ifRoom" android:title="@string/menu_edit"/> <item android:id="@+id/menu_save" android:icon="@android:drawable/ic_menu_save" android:showAsAction="ifRoom" android:title="@string/menu_save"/> <item android:id="@+id/menu_delete" android:icon="@android:drawable/ic_menu_delete" android:showAsAction="ifRoom" android:title="@string/menu_delete"/> <item android:id="@+id/action_share" android:icon="@android:drawable/ic_menu_share" android:showAsAction="ifRoom" android:title="@string/menu_share"/></menu>
1.2、在Activity或Fragment的onCreateOptionsMenu里进行填充
public class MenuNavActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.menu_layout);ActionBar mActionBar = getActionBar();// 将 Home 按钮显示为向上, 提示用户点击这个按钮可以返回应用程序的上一级。mActionBar.setDisplayHomeAsUpEnabled(true);}/** * 利用xml布局文件 */@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.opt_menu, menu); return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // app icon in action bar clicked; go home Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true; default: return super.onOptionsItemSelected(item); }}}
2、直接在Activity或Fragment的onCreateOptionsMenu里实现
public class MenuNavActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.menu_layout);ActionBar mActionBar = getActionBar();// 将 Home 按钮显示为向上, 提示用户点击这个按钮可以返回应用程序的上一级。mActionBar.setDisplayHomeAsUpEnabled(true);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuItem actionItem = menu.add("Edit");actionItem.setIcon(android.R.drawable.ic_menu_edit);actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); MenuItem actionItem2 = menu.add("Delete");actionItem2.setIcon(android.R.drawable.ic_menu_delete);actionItem2.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // app icon in action bar clicked; go home Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true; default: return super.onOptionsItemSelected(item); }}}
运行效果图
二、提供导航标签
TabNavActivity.java
public class TabNavActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.tab_layout);// 设置 ActionBarActionBar mActionBar = getActionBar();// 将 Home 设置为向上mActionBar.setDisplayHomeAsUpEnabled(true);// 设置 ActionBar 的导航模式为TABmActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);mActionBar.setDisplayOptions(0,ActionBar.DISPLAY_SHOW_TITLE);Tab t1 = mActionBar.newTab();t1.setText("首页ABC");t1.setTabListener(new MyTabListener<HomeFragment>(this, "home", HomeFragment.class));mActionBar.addTab(t1);Tab t2 = mActionBar.newTab();t2.setText("好友ABC");t2.setTabListener(new MyTabListener<FriendFragment>(this, "friend", FriendFragment.class));mActionBar.addTab(t2);Tab t3 = mActionBar.newTab();t3.setText("消息ABC");t3.setTabListener(new MyTabListener<MessageFragment>(this, "message", MessageFragment.class));mActionBar.addTab(t3);Tab t4 = mActionBar.newTab();t4.setText("设置ABC");t4.setTabListener(new MyTabListener<SettingFragment>(this, "setting", SettingFragment.class));mActionBar.addTab(t4);if (savedInstanceState != null) {//默认打开上次推出时候的Fragment mActionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); }}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putInt("tab", getActionBar().getSelectedNavigationIndex());}public static class MyTabListener<T extends Fragment> implements ActionBar.TabListener { private final Activity mActivity; private final String mTag; private final Class<T> mClass; private final Bundle mArgs; private Fragment mFragment; public MyTabListener(Activity activity, String tag, Class<T> clz) { this(activity, tag, clz, null); } public MyTabListener(Activity activity, String tag, Class<T> clz, Bundle args) { mActivity = activity; mTag = tag; mClass = clz; mArgs = args; // Check to see if we already have a fragment for this tab, probably // from a previously saved state. If so, deactivate it, because our // initial state is that a tab isn't shown. mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag); if (mFragment != null && !mFragment.isDetached()) { FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); ft.detach(mFragment); ft.commit(); } } public void onTabSelected(Tab tab, FragmentTransaction ft) { if (mFragment == null) { mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); ft.add(R.id.ll_content, mFragment, mTag); } else { ft.attach(mFragment); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (mFragment != null) { ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { Toast.makeText(mActivity, "onTabReselected", 0).show(); } }@Overridepublic boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // app icon in action bar clicked; go home Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true; default: return super.onOptionsItemSelected(item); }}}
HomeFragment.java
public class HomeFragment extends Fragment implements OnQueryTextListener {private static final String TAG = null;@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.home, null);return view;}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {// We have a menu item to show in action bar. setHasOptionsMenu(true); super.onActivityCreated(savedInstanceState);}@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Place an action bar item for searching. MenuItem item = menu.add("Search"); item.setIcon(android.R.drawable.ic_menu_search); item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); SearchView sv = new SearchView(getActivity()); sv.setOnQueryTextListener(this); item.setActionView(sv); }@Overridepublic void onPause() {// TODO Auto-generated method stubsuper.onPause();}@Overridepublic boolean onQueryTextChange(String newText) {Log.e(TAG, "newText="+newText);return true;}@Overridepublic boolean onQueryTextSubmit(String query) {Log.e(TAG, "newText="+query);return true;}}
余下Fragment类似
运行效果图
三、提供向上导航
使用应用的图标作为活动项,代表返回home或者向上等重要操作。
package com.yulore.nav;import android.app.ActionBar;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.MenuItem;public class NavUpActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.nav_up_layout);ActionBar mActionBar = getActionBar();// 将 Home 按钮显示为向上, 提示用户点击这个按钮可以返回应用程序的上一级。mActionBar.setDisplayHomeAsUpEnabled(true);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // app icon in action bar clicked; go home Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true; default: return super.onOptionsItemSelected(item); }}}
运行效果图
四、提供下拉导航功能
package com.yulore.nav;import android.app.ActionBar;import android.app.ActionBar.OnNavigationListener;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.MenuItem;import android.widget.ArrayAdapter;import android.widget.Toast;/** * 下拉列表导航 * @author feng bingbing * */public class SpinnerNavActivity extends Activity {private String[] titles = { "首页", "好友", "消息", "广场", "设置" };private ArrayAdapter<String> adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.spin_layout);// 设置 ActionBarActionBar mActionBar = getActionBar();// 将 Home 设置为向上mActionBar.setDisplayHomeAsUpEnabled(true);// 设置 ActionBar 的导航模式为下拉列表mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);// 第二步:为下拉列表定义一个适配器adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, titles);// 第三步:为适配器设置下拉列表下拉时的菜单样式。adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 选中的事件监听OnNavigationListener callback = new MyOnNavigationListener();// 设置列表导航的回调参数mActionBar.setListNavigationCallbacks(adapter, callback);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home:// app icon in action bar clicked; go homeIntent intent = new Intent(this, MainActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);return true;default:return super.onOptionsItemSelected(item);}}private class MyOnNavigationListener implements OnNavigationListener {@Overridepublic boolean onNavigationItemSelected(int itemPosition, long itemId) {Toast.makeText(getApplicationContext(),"当前选择了:" + titles[itemPosition], 0).show();return false;}}}
运行效果图
更多相关文章
- WebView详解与简单实现Android与H5互调
- android三级缓存详解
- Android Studio中Module的build.gradle详解
- android图形系统详解五:Android绘制模式
- Android task和back stack详解四:intent中定义启动模式
- [Android基础系列]轻松实现按钮的鼠标悬停背景切换
- 详解Android首选项框架的使用