参考:http://blog.csdn.net/guolin_blog/article/details/25466665
一、ActionProvider
作用:①、自定义Toolbar的按钮 ②、自带子菜单(子菜单还能够显示图片和文字)
效果展示:(自定义Toolbar的按钮(这里是个图片,可以是其他的View),点击后产生子菜单,子菜单的内容自定义)
①、使用Android提供的Provider(完成效果图的效果)
在menu/toolbar_menu(添加ActionProvider到视图)
1、使用Android自带的ShareProvider(顾名思义,是用来分享用的)
2、主要属性:app:actionProviderClass="控件的路径名"(属性跟ActionView差不多)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_share"
android:title="分享"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
</menu>
②、从代码中获取ActionProvider,并设置子菜单的item
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu,menu);
MenuItem menuItem = menu.findItem(R.id.menu_share);
//由于本人用的还是v4的包,但是ShareActionProvider是v7的包,所以使用MenuItemCompat向下兼容
ShareActionProvider provider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);
//通过intent设置子菜单的tiem
provider.setShareIntent(getDefaultIntent());
return super.onCreateOptionsMenu(menu);
}
private Intent getDefaultIntent(){
Intent intent = new Intent();
//表示搜索全部共享图片的intent
intent.setType("image/*");
return intent;
}
1、继承ActionProvider
onCreateActionView():设定按钮的显示样式。这里先为null。
2、重写onPrepareSubMenu()方法
回调时机:当点击Toolbar上的按钮,展开子菜单的时候调用。
作用:添加subItem到子菜单
3、设置hasSubMenu为true
作用:判断是否有子菜单,如果为false则点击不出子菜单
4、添加到menu/toolbar.xml中
作用:①、显示ActionProvider的位置。②、如果没设置onCreateActionView(),则可以设置android:icon=""之后按钮显示的就是图片,如果设置了onCreateActionView()那么之后按钮显示的就是View。
5、启动查看效果
public class MyActionProvider extends ActionProvider {
public MyActionProvider(Context context) {
super(context);
}
/**
* 设置Toolbar上显示按钮的样式
*/
@Override
public View onCreateActionView() {
return null;
}
/**
* 当点击Toolbar上的按钮,展开子菜单的时候调用
* @param subMenu
*/
@Override
public void onPrepareSubMenu(SubMenu subMenu) {
super.onPrepareSubMenu(subMenu);
//删除之前的子菜单
subMenu.clear();
//添加一个Item到子菜单
subMenu.add("item 1")
.setIcon(R.mipmap.ic_launcher)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return true;
}
});
subMenu.add("item 2")
.setIcon(R.mipmap.ic_launcher)
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
});
}
/**
* 设定是否拥有子菜单
* @return
*/
@Override
public boolean hasSubMenu() {
return true;
}
}
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--添加自定义的ActionProvider,并设置按钮的图片icon-->
<item
android:id="@+id/menu_my_provider"
android:title="我的Provider"
android:icon="@mipmap/ic_launcher"
app:showAsAction="ifRoom"
app:actionProviderClass="com.newbiechen.usetoolbar.MyActionProvider"/>
</menu>
效果跟之前的ShareProvider差不多。
还有可以试一下天添加onCreateActionView(),来自定按钮。
二、导航Tabs
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--添加Toolbar-->
<include
layout="@layout/toolbar"/>
<!--头部的导航栏-->
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"></android.support.design.widget.TabLayout>
<!--主题内容,用Fragment切换-->
<FrameLayout
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</FrameLayout>
</LinearLayout>
然后,在代码中添加导航栏中的item
public class FirstActivity extends AppCompatActivity {
private Toolbar mToolbar;
private TabLayout mTabLayout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mTabLayout = (TabLayout) findViewById(R.id.tab_layout);
setSupportActionBar(mToolbar);
mToolbar.setTitle("FirstActivity");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//通过添加Tab来添加导航栏的item
mTabLayout.addTab(mTabLayout.newTab().setText("第一页"));
mTabLayout.addTab(mTabLayout.newTab().setText("第二页"));
//设定item的点击监听,这里可以用来切换Fragment
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//当tab被选中的时候调用。这里用来切换Fragment
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
//当tab被释放的时候调用
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//当tab被再次选中的时候调用
}
});
}
}
关于如何切换Fragment,就不描述了。。。。
三、Toolbar+DrawerLayout+ViewPager打造界面滑动布局
四、利用Toolbar仿造微信界面
http://blog.csdn.net/guolin_blog/article/details/26365683