原文:郭霖的博客
http://blog.csdn.net/guolin_blog/article/details/18234477
源代码:
http://download.csdn.net/download/u011109881/10150399
demo1(xml和图片就不贴了)
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 代码隐藏ActionBar
// ActionBar actionBar = getActionBar();
// actionBar.hide();
// 启用ActionBar图标导航的功能,可以允许用户根据当前应用的位置来在不同界面之间切换。
// 比如,A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
setOverflowShowingAlways();
}
// overflow中的Action按钮应不应该显示图标,是由MenuBuilder这个类的setOptionalIconsVisible方法来决定的
// 如果我们在overflow被展开的时候给这个方法传入true,那么里面的每一个Action按钮对应的图标就都会显示出来了。
// 调用的方法当然仍然是用反射了
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {
if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
try {
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
}
}
}
return super.onMenuOpened(featureId, menu);
}
// 通过反射 解决有的机器,overflow菜单按menu键显示在下方的问题
private void setOverflowShowingAlways() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
// 让系统固定认为没有物理menu按钮(android系统通过判断有没有物理按钮来决定overflow是否显示)
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
} catch (Exception e) {
e.printStackTrace();
}
}
// 想要显示ActionBar上的按钮要重写的方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
// 如果你希望在代码中对SearchView的属性进行配置(比如添加监听事件等),
// 需要在onCreateOptionsMenu()方法中获取该ActionView的实例就可以了
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
// 下面配置SearchView的属性
// 参见http://developer.android.com/guide/topics/search/search-dialog.html
// ...
// 监听search view 打开关闭
searchItem.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Toast.makeText(MainActivity.this, "onMenuItemActionExpand",
Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Toast.makeText(MainActivity.this, "onMenuItemActionCollapse",
Toast.LENGTH_SHORT).show();
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
// 当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,
// 通过方法传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别出用户点击的是哪一个Action按钮
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// ActionBar图标的左侧出现了一个向左的箭头,通常情况下这都表示返回的意思,该按钮的id固定为android.R.id.home
// ActionBar的导航还不是很明白 原文中实现需要三步
// http://blog.csdn.net/guolin_blog/article/details/18234477
case android.R.id.home:
finish();
return true;
case R.id.action_compose:
Toast.makeText(this, "Compose", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, Activity2.class);
startActivity(intent);
return true;
case R.id.action_delete:
Toast.makeText(this, "Delete", Toast.LENGTH_SHORT).show();
return true;
case R.id.action_settings:
Toast.makeText(this, "Settings", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
public class Activity2 extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 启用ActionBar图标导航的功能,可以允许用户根据当前应用的位置来在不同界面之间切换。
// 比如,A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// ActionBar图标的左侧出现了一个向左的箭头,通常情况下这都表示返回的意思,该按钮的id固定为android.R.id.home
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
demo2
public class AlbumFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setText("Album Fragment");
textView.setGravity(Gravity.CENTER_HORIZONTAL);
LinearLayout layout = new LinearLayout(getActivity());
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
layout.addView(textView, params);
return layout;
}
}
public class AltistFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setText("Altist Fragment");
textView.setGravity(Gravity.CENTER_HORIZONTAL);
LinearLayout layout = new LinearLayout(getActivity());
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
layout.addView(textView, params);
return layout;
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气天气");
//自定义actionBar布局
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); //Enable自定义的View
actionBar.setCustomView(R.layout.actionbar_custom);//设置自定义的布局:actionbar_custom
}
//setOverflowShowingAlways();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Tab tab = actionBar
.newTab()
.setText("artistxx")
.setTabListener(
new TabListener<AltistFragment>(this, "artist",
AltistFragment.class));
actionBar.addTab(tab);
tab = actionBar
.newTab()
.setText("albumxx")
.setTabListener(
new TabListener<AlbumFragment>(this, "album",
AlbumFragment.class));
actionBar.addTab(tab);
}
// 由于每个Action Provider都可以自由地控制事件响应,
// 所以它们不需要在onOptionsItemSelected()方法中再去监听点击事件,
// 而是应该在onPerformDefaultAction()方法中去执行相应的逻辑
// onCreateOptionsMenu()中调用MenuItem的getActionProvider()方法
// 来得到该ShareActionProvider对象,
// 再通过setShareIntent()方法去选择构建出什么样的一个Intent
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider provider = (ShareActionProvider) shareItem
.getActionProvider();
provider.setShareIntent(getDefaultIntent());
return super.onCreateOptionsMenu(menu);
}
private Intent getDefaultIntent() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
return intent;
}
}
//自定义一个Action Provider,比如说如果想要建立一个拥有两项子菜单的Action Provider
//新建了一个MyActionProvider继承自ActionProvider,为了表示这个Action Provider是有子菜单的,需要重写hasSubMenu()方法并返回true,
//然后在onPrepareSubMenu通过调用SubMenu的add()方法添加子菜单
public class MyActionProvider extends ActionProvider {
public MyActionProvider(Context context) {
super(context);
}
@Override
public View onCreateActionView() {
return null;
}
@Override
public void onPrepareSubMenu(SubMenu subMenu) {
subMenu.clear();
subMenu.add("sub item 1").setIcon(R.drawable.ic_launcher)
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return true;
}
});
subMenu.add("sub item 2").setIcon(R.drawable.ic_launcher)
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
});
}
@Override
public boolean hasSubMenu() {
return true;
}
}
public class TabListener<T extends Fragment> implements
android.app.ActionBar.TabListener {
/* 使用ActionBar提供的Tab功能,大致可以分为以下几步
1. 实现ActionBar.TabListener接口,这个接口提供了Tab事件的各种回调,比如当用户点击了一个Tab时,你就可以进行切换Tab的操作。
2.为每一个你想添加的Tab创建一个ActionBar.Tab的实例,并且调用setTabListener()方法来设置ActionBar.TabListener。除此之外,还需要调用setText()方法来给当前Tab设置标题。
3.最后调用ActionBar的addTab()方法将创建好的Tab添加到ActionBar中。*/
private Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
public TabListener(Activity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}
// 当Tab被选中的时候会调用onTabSelected()方法,
// 在这里我们先判断mFragment是否为空,
// 如果为空的话就创建Fragment的实例并调用FragmentTransaction的add()方法,
// 如果不会空的话就调用FragmentTransaction的attach()方法。
// 而当Tab没有被选中的时候,则调用FragmentTransaction的detach()方法,将UI资源释放掉。
// 当Tab被重新选中的时候会调用onTabReselected()方法,如果没有特殊需求的话,通常是不需要进行处理的。
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mFragment == null) {
mFragment = Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.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) {
}
}