DrawerLayout
侧滑菜单。在support-v4包中,当用户手指从屏幕边缘开始滑动时,会将侧滑菜单滑开。一般将它做为布局的根节点,它的第一个子view就是要显示的内容区域,其余的子view都属性侧滑菜单。
对于内容区域,它的宽高一般为match_parent,一定是Drawerlayout的第一个子view。
对于侧滑菜单,可以分为左边和右边的,通过layout_gravity属性指定:该属性的值为left时就是左边侧滑菜单,为right是就是右边侧滑菜单。
可以通过setDrawerListener(DrawerListener)设置侧滑的监听。
常用方法
setDrawerListener():设置监听。
openDrawer(int|View):打开指定的侧滑菜单。int为Gravity中的值,Gravity.LEFT打开左边侧滑菜单,Gravity.RIGHT打开右边侧滑菜单。
closeDrawer(int|View):同openDrawer()。
setDrawerLockMode(int):设置菜单的打开方式。参数为DrawerLayout.LOCK_MODE_*。DrawerLayout.LOCK_MODE_LOCKED_CLOSED:用户无法通过手指滑开菜单,只能通过代码打开。LOCK_MODE_LOCKED_OPEN:用户无法关闭菜单,只能通过代码控制。LOCK_MODE_UNLOCKED:用户可以随心所欲地打开关闭。
setDrawerShadow():设置菜单的阴影图片。因为侧滑菜单占不满全屏,在空白区域就是shadow。
Toolbar
toolbar是actionbar的升级版,但比actionbar要方便灵活地多。一般来说,actionbar是一个Activity界面的一部分,并且由framework层控制。但toolbar却不是,它就像一个view一样(它本身就是继承于ViewGroup),可以放置在任何地方,放置到任意的视图层级中。
toolbar与actionbar最大的区别在于:toolbar会自动生成溢出菜单(overflow menu),无论有无实体菜单键;而actionbar只有在没有实体菜单键的时候才会自动生成溢出菜单。
如果想像actionbar一样使用toolbar,也可以调用activity#setSupportActionBar(Toolbar)将toolbar转换成actionbar。一旦转换为actionbar后, 就需要通过onCreateOptionsMenu()与onOptionsItemSelected()进行操作。
对于toolbar来说,它加载的也是menu菜单。其几个view如下:
使用
toolbar本身是一个viewgroup,因此其内部可以放子View。也可以通过子View的layout_gravity设置子View所处的位置。如下:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/Toolbar"
android:gravity="center_horizontal"
app:popupTheme="@style/TestToolbar" >
<TextView
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:textColor="@android:color/black"
android:textSize="20dp"
android:text="title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.v7.widget.Toolbar>
上述代码,在toolbar内部设置了一个TextView,并且使其水平居中。因此,显示的时候会在toolbar的中间显示出一个title。利用这种性质,完全可以写成仿iOS的titleView——再也不怕设计仿iOS设计,而非得自定义titleView了。
溢出菜单
在使用toolbar时,溢出菜单是与toolbar顶部齐平的,可能不满足某些设计。此时可以不使用默认的溢出菜单,而将溢出菜单的位置设置一个icon,并结合popupmenu达到效果。如下:
@Override
public void showFilteringPopUpMenu() {
PopupMenu popup = new PopupMenu(getContext(), getActivity().findViewById(R.id.menu_filter));
popup.getMenuInflater().inflate(R.menu.filter_tasks, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.active:
mPresenter.setFiltering(TasksFilterType.ACTIVE_TASKS);
break;
case R.id.completed:
mPresenter.setFiltering(TasksFilterType.COMPLETED_TASKS);
break;
default:
mPresenter.setFiltering(TasksFilterType.ALL_TASKS);
break;
}
return true;
}
});
popup.show();
}
点击toolbar是某个按钮时的操作。
常用方法
inflateMenu():为toolbar填充对应的布局,参数为menu布局。如果该toolbar被当作了setSupportActionBar的参数,那么该方法无效。
setOnMenuItemClickListener():设置toolbar中每一个item的点击事件。
setNavigationIcon():设置导航的图标。显示在toolbar的最左边
setNavigationOnClickListener():设置导航图标的点击事件。
常用属性
titleTextAppearance:设置title显示的样式
subtitleTextAppearance:设置subtitle显示的样式
popupTheme:溢出菜单的样式。可以通过它控件溢出菜单显示的文字颜色等。
注意
1,当前activity的theme应为@style/Theme.AppCompat子类。
2,为兼容低版本,activity要继承AppCompatActivity
3,将toolbar转换为actionbar后,需要将原来自带的actionbar给删除。可以将该activity的theme继承@style/Theme.AppCompat.NoActionBar或者添加上
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
ActionBarDrawerToggle
它实质是DrawerLayout.DrawerListener,因此它可以用在setDrawerListener()方法中。但它实质上也如一下view一样,在DrawerLayout滑动的时候,toggle显示的内容会随之变化。
它本身可以连接toolbar与DrawerLayout,并且做为toolbar的navigation icon使用。
初始化toggle后,需要调用它的syncState(),在这里才会将toggle设置为toolbar的navigation icon。
示例
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
content = (TextView) findViewById(R.id.root);
layout = (DrawerLayout) findViewById(R.id.co);
bar = (Toolbar) findViewById(R.id.tool);
bar.inflateMenu(R.menu.menu_toolbar);
bar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
//menu item click
}
return true;
}
});
ListView menu = (ListView) findViewById(R.id.menu);
List<Map<String, Object>> data = new ArrayList<>();
for (int x = 0; x < 3; x++) {
Map<String, Object> map = new HashMap<>();
map.put("icon", ICON_IDS[x]);
map.put("title", getResources().getString(TITLES[x]));
data.add(map);
}
menu.setAdapter(new SimpleAdapter(this, data, R.layout.activity_plugin, new String[]{"title", "icon"}, new int[]{R.id.item_title, R.id.item_icon}));
menu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//侧滑菜单的点击事件
layout.closeDrawer(Gravity.LEFT);
}
});
//My extends ActionBarDrawerToggle。
My my = new My(layout,bar);
layout.setDrawerListener(my);
my.syncState();//将My与Toolbar关联
}
其布局为
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--顶部的toolbar-->
<android.support.v7.widget.Toolbar
android:id="@+id/tool"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="title" />
<android.support.v4.widget.DrawerLayout
android:id="@+id/co"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--内容区域,一般该区域可以使用fragment-->
<TextView
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="这是内容区域" />
<!--左滑菜单-->
<ListView
android:id="@+id/menu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:background="@android:color/holo_green_light" />
</android.support.v4.widget.DrawerLayout>
</LinearLayout>