侧滑菜单。在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是actionbar的升级版,但比actionbar要方便灵活地多。一般来说,actionbar是一个Activity界面的一部分,并且由framework层控制。但toolbar却不是,它就像一个view一样,可以放置在任何地方,放置到任意的视图层级中。
toolbar与actionbar最大的区别在于:toolbar会自动生成溢出菜单(overflow menu),无论有无实体菜单键;而actionbar只有在没有实体菜单键的时候才会自动生成溢出菜单。
如果想像actionbar一样使用toolbar,也可以调用activity#setSupportActionBar(Toolbar)将toolbar转换成actionbar。一旦转换为actionbar后, 就需要通过onCreateOptionsMenu()与onOptionsItemSelected()进行操作。
对于toolbar来说,它加载的也是menu菜单。其几个view如下:
inflateMenu():为toolbar填充对应的布局,参数为menu布局。如果该toolbar被当作了setSupportActionBar的参数,那么该方法无效。
setOnMenuItemClickListener():设置toolbar中每一个item的点击事件。
setNavigationIcon():设置导航的图标。显示在toolbar的最左边
setNavigationOnClickListener():设置导航图标的点击事件。
titleTextAppearance:设置title显示的样式
subtitleTextAppearance:设置subtitle显示的样式
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>
它实质是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>
final NavigationView nav = (NavigationView) findViewById(R.id.nav_menu); nav.post(new Runnable() { @Override public void run() {//获取headerLayout中的控件 ImageView icon = (ImageView) nav.findViewById(R.id.nav_header_icon); RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getResources(), BitmapFactory.decodeResource(getResources(), R.drawable.bg)); drawable.setCircular(true); icon.setImageDrawable(drawable); } }); //设置每一个菜单项的点击事件 nav.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { switch (item.getItemId()){ case R.id.ment_accept: content.setText("accept"); break; } return true; } });其布局使用示例为:
<android.support.design.widget.NavigationView android:id="@+id/nav_menu" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/activity_plugin" app:itemTextAppearance="@style/nav_text_appearance" app:itemBackground="@drawable/selector_menu_item_bg" app:menu="@menu/menu_toolbar" />