DrawerLayout,Toolbar与NavigationView

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一样,可以放置在任何地方,放置到任意的视图层级中。

        toolbar与actionbar最大的区别在于:toolbar会自动生成溢出菜单(overflow menu),无论有无实体菜单键;而actionbar只有在没有实体菜单键的时候才会自动生成溢出菜单

        如果想像actionbar一样使用toolbar,也可以调用activity#setSupportActionBar(Toolbar)将toolbar转换成actionbar。一旦转换为actionbar后, 就需要通过onCreateOptionsMenu()与onOptionsItemSelected()进行操作。

       对于toolbar来说,它加载的也是menu菜单。其几个view如下:

DrawerLayout,Toolbar与NavigationView_第1张图片

常用方法

        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>

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>

NavigationView

        在上面示例中,菜单项是通过listview自己添加的,而android support design包中提供的NavigationView是专门用来显示菜单项的。
        它与toolbar一样,也是加载menu文件。

常用属性

        headerLayout:菜单项的头。可选。headerLayout中的组件必须等navView加载完毕后,通过navView.findViewById()才能获取到。
        menu:NavigationView要加载的menu文件。
        itemBackground:每一个菜单项的背景。
        itemTextAppearance:每一个菜单项中提示文字的样式,可以设置大小,颜色等。

常用方法

        setNavigationItemSelectedListener():点击每一个菜单项时的回调。

示例

        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" />




你可能感兴趣的:(DrawerLayout,Toolbar与NavigationView)